插入值

时间:2015-10-19 11:34:44

标签: sql-server

希望有人可以提供帮助。我创建了两个表Customer和Order,如下所示;

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

Customer表中的其他列与我的问题无关,因此我不会在此处包含它们。我的客户ID号码从1到15,都是唯一的。

我创建的第二个表是Orders如下

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语句冲突   使用FOREIGN KEY约束" FK__OrderT__Customer__2D27B809"。该   发生冲突表" dbo.Customer",栏目' CustomerID'。该   声明已被终止。

我的订单表中的CustomerID号码是(1; 1; 2; 3; 4; 5; 8; 11; 12和15)。因此,我检查了Order表中的所有CustomerID号码也在Customer表中。

所以我的问题是

1)插入值是否失败,因为Customer表中的CustomerID列为NOT NULL而I中的错误使CustomerID列在Order中为NULL。

2)如果上述问题的答案是肯定的,那么我是否可以(a)在订单中删除CustomerID列上的外键(b)将列更改为NOT NULL并且(c)然后添加外键约束再次到此列,然后再次插入值?

删除并重新创建表Order可能更容易。但我很好奇,如果选项2可以工作,重新删除并在同一列上添加一个外键。

希望我在正确的轨道上,为什么我认为错误发生了,感觉 如果我错了,纠正我。

谢谢大家 乔西

3 个答案:

答案 0 :(得分: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 );

最后一个会出错,因为有CustomerID 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] );

答案 1 :(得分:0)

  

1)插入值是否因为我的CustomerID列而失败   客户表在NOT NULL和我的错误中使CustomerID列为NULL   按顺序。

没有。该错误与在Order表中允许NULL无关。将允许NULL值,而不检查参照完整性。

外键冲突错误意味着您正在尝试将非NULL CustomerID值插入到Customer表中不存在的Customer表中。如果您确定存在CustomerID值,则列映射可能是错误的。尝试在INSERT语句中指定显式列列表。

答案 2 :(得分:0)

当您尝试在外键列中插入一个值时,会发生此错误,该值在其父表中不存在。例如,您正在尝试将值X插入Order表中的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