2015-10-19 96 views
3

希望有人可以提供幫助。我創建了兩個表Customer和Order,如下所示;插入值時外鍵約束失敗和錯誤消息

CREATE TABLE Customer 
CustomerID int NOT NULL PRIMARY KEY 
CustomerName varchar(25) 

在客戶表中的其他列是不相關的我的問題,所以我不會把它們放在這裏。我的客戶號碼從1到15,都是唯一的。

我創建的第二個表是訂單如下

CREATE TABLE Orders 
OrderID smallint NOT NULL PRIMARY KEY 
OrderDate date NOT NULL 
CustomerID int FOREIGN KEY REFERENCES Customer (CustomerID); 

我插入值如下:

INSERT INTO Orders (OrderID, OrderDate, CustomerID) 
VALUES 
(1001, '2008-10-21', 1), 
(1002, '2008-10-21', 8), 
(1003, '2008-10-22', 15), 
(1004, '2008-10-22', 5), 
(1005, '2008-10-24', 3), 
(1006, '2008-10-24', 2), 
(1007, '2008-10-27', 11), 
(1008, '2008-10-30', 12), 
(1009, '2008-11-05', 4), 
(1010, '2008-11-05', 1); 

當我嘗試插入我的價值觀到Order表,我得到以下錯誤消息....

Msg 547,Level 16,State 0,Line 1 ..... INSERT語句衝突 w FOREIGN KEY約束「FK__OrderT__Customer__2D27B809」。 發生衝突表「dbo.Customer」,列'CustomerID'。 聲明已被終止。

我的訂單表中CustomerID的編號是(1; 1; 2; 3; 4; 5; 8; 11; 12和15)。因此我檢查了Order表中的所有CustomerID號碼都在Customer表中。

所以我的問題是

1)具有插入值失敗,因爲我的客戶表我CustomerID列在NOT NULL和錯誤,以取得客戶ID列NULL。如果對上述問題的答案是肯定的,那麼是否有可能(a)將外鍵放在Order(b)中的CustomerID列上,將列更改爲NOT NULL,然後(c)將再次將外鍵約束添加到此列,然後再次插入值?

刪除並重新創建表格Order可能更容易。但我很好奇,如果選項2將工作,重新刪除並添加一個外鍵在同一列。

希望我在正確的軌道上,爲什麼我認爲發生錯誤,感覺 糾正我,如果我錯了。

謝謝大家 喬西

+0

什麼樣的價值是無法被插入,雖然? –

+0

OrderT or Orders?這是一個錯字嗎? –

+0

@Abdul - 這個表在SQL中叫做OrderT,我在這裏叫它Order,所以它是一個錯字,我指的是同一張表。 – Josie

回答

1

1)它應該是在這兩個NOT NULL。但是,錯誤是因爲您試圖插入不在Customer表中的CustomerId。

2)您可以簡單地修改表格並將其設置爲NOT NULL(錯誤不是這樣)。

樣品:

CREATE TABLE Customer 
    (
    CustomerID INT NOT NULL 
        PRIMARY KEY , 
    CustomerName VARCHAR(25) 
); 

CREATE TABLE Orders 
    (
    OrderID INT NOT NULL 
       PRIMARY KEY , 
    OrderDate DATE NOT NULL , 
    CustomerID INT FOREIGN KEY REFERENCES Customer (CustomerID) 
); 

INSERT [Customer] ([CustomerID], [CustomerName]) 
VALUES ( 1, 'Customer 1'), 
( 2, 'Customer 2'), 
( 3, 'Customer 3'), 
( 4, 'Customer 4'), 
( 5, 'Customer 5'), 
( 6, 'Customer 6'); 


INSERT [Orders] ([OrderID], [OrderDate], [CustomerID]) 
VALUES 
(1, GETDATE(), 1), 
(2, GETDATE(), 2), 
(3, GETDATE(), 3), 
(4, GETDATE(), 4), 
(5, GETDATE(), 5), 
(6, GETDATE(), 6); 

INSERT [Orders] ([OrderID], [OrderDate], [CustomerID]) 
VALUES (7, GETDATE(), 7); 

最後一個會出錯,因爲客戶與客戶ID 7不存在。

更新:我後來看到您的示例插入。你可以找到有問題的ID是這樣的:

DECLARE @ids TABLE (id INT); 
INSERT @ids ([id]) 
VALUES (1), 
     (8), 
     (15), 
     (5), 
     (3), 
     (2), 
     (11), 
     (12), 
     (4), 
     (1); 

SELECT * 
FROM @ids AS [i] 
WHERE id NOT IN (SELECT CustomerID 
        FROM [Customer] AS [c]); 
0

1)具有插入值失敗,因爲我在 Customer表我CustomerID列在NOT NULL和錯誤,以取得客戶ID列NULL 。

否。該錯誤與訂單表中允許NULL無關。一個NULL值將被允許並且不檢查參照完整性。

外鍵違規錯誤意味着您正嘗試向客戶中不存在的Order表中插入一個非NULL CustomerID值。如果您確定CustomerID值存在,那麼列映射可能是錯誤的。嘗試在INSERT聲明中指定明確的列列表。

0

這個錯誤發生在你試圖在外鍵列中插入一個值,而這個值不存在於它的父表中。例如,您正試圖在Order表中將值X插入到CustomerId中,該值在Customer表中不存在。發生此錯誤是因爲我們需要有一個良好的參照完整性策略。所以你唯一需要做的就是檢查你的新值(你將它們插入到表中)以發現是否有任何有損該規則的值。

但是,如果你想獲得你的第二個問題的答案,你可以試試下面的腳本:

create table t1 
(
    Id int primary key, 
    Name varchar(50) null 
) 
create table t2 
(
    Id int, 
    FK int null foreign key references t1(id) 
) 

go 

alter table t2 
alter column FK int not null