为什么我的外键在插入值时为NULL

时间:2015-07-23 12:39:03

标签: c# sql-server sql-server-2008 foreign-keys primary-key

我是sqlserver初学者,我首先创建了一个表CUSTOMERS,见下文:

CREATE TABLE CUSTOMERS ( ID INT NOT NULL,
NAME VARCHAR(20) NOT NULL, 
AGE INT NOT NULL, 
ADDRESS CHAR (25) , 
SALARY DECIMAL (18,2) DEFAULT 70000, not null identity(1, 1) PRIMARY KEY (ID));

然后我在表格中插入了这样的值:

INSERT INTO [vims].[dbo].[CUSTOMERS] (NAME, AGE, ADDRESS, SALARY) 
VALUES('AbheshekKaBhai',21,'Agra',70000.00);  

并且成功完成了 请看这个: http://prntscr.com/7w19cr \

我创建了另一个表ORDERS之后:

CREATE TABLE [vims].[dbo].ORDERS (
  ID INT not null identity(1, 1) PRIMARY KEY,
DATE DATETIME,
Customer_ID  INT FOREIGN KEY (Customer_ID) REFERENCES CUSTOMERS (ID),
AMOUNT INT );

我在其中插入数据:

INSERT INTO [vims].[dbo].ORDERS(DATE,AMOUNT) VALUES(28,66000.00); 

我按重复插入记录6次得到这样的表: http://prntscr.com/7w1a6j

我的问题是,当我尝试在外键列中插入数据时,它会给出错误,说明CUSTOMERS和ORDERS之间存在ID值的冲突,当我在外键列中没有添加任何内容时,它显示为null。为什么这样做?如何在外键列上插入值?

2 个答案:

答案 0 :(得分:1)

执行插入时需要执行以下操作:

Declare @CustomerID int
INSERT INTO [vims].[dbo].[CUSTOMERS](NAME,AGE,ADDRESS,SALARY)
    VALUES('AbheshekKaBhai',21,'Agra',70000.00);
@CustomerID = SCOPE_IDENTITY()
INSERT INTO [vims].[dbo].ORDERS(DATE,AMOUNT,Customer_ID
    VALUES(28,66000.00,@CustomerID); 

您没有在insert语句中插入外键。插入时子表中的外键需要有一个值。它不会自动进行。

答案 1 :(得分:1)

首先,如果要在引用Customer_ID的ORDERS表中插入任何记录,则客户ID应存在于CUSTOMER表中。

其次,如果您不想在ORDERS表中的外键列中添加NULL,则声明时将该列设置为NOT NULL。因此,任何没有正确关系的插入都不会被插入(包括null)。

echo $this->formCollection($form->get('some-name'));

希望有所帮助。