SQL Server,不能将null插入主键字段?

时间:2010-10-06 20:53:58

标签: sql sql-server database-design insert

我准备把这头发撕掉了。我是MS SQL的新手,并没有在任何地方看过类似的帖子。

当我尝试做这样的陈述时:

INSERT INTO qcRawMatTestCharacteristic 
VALUES(NULL, 1,1,1,1,1,1,1,'','','', GETDATE(), 1)

我得到以下内容:

  

无法将值NULL插入   列'iRawMatTestCharacteristicId',   表   'Intranet.dbo.qcRawMatTestCharacteristic';   列不允许空值。插入   失败。

我理解错误,但是null值是我的主要字段的int数据类型。

任何想法!?

8 个答案:

答案 0 :(得分:48)

任何关系数据库中的主键不允许为NULL - 这是主键的主要基本特征之一。

请参阅:SQL by Design: how to Choose the primary key

  

永不空虚
  没有主键值可以为null,也不能执行任何操作   渲染主键null。 这是   关系的不可侵犯的规则   由ANSI 支持的模型   关系数据库管理系统   (RDBMS)设计和SQL Server。

更新:确定,因此您希望在SQL Server中使用“自动增量”主键。

您需要在CREATE TABLE语句中将其定义为INT IDENTITY:

 CREATE TABLE dbo.YourTable(ID INT IDENTITY, col1 INT, ..., colN INT)

然后当你执行INSERT时,需要显式指定要插入的列,但是不要在该列表中指定“ID”列 - 然后SQL Server将自动处理找到正确的值:

 INSERT INTO dbo.YourTable(col1, col2, ..., colN) -- anything **except** `ID`      
 VALUES(va1l, val2, ..., valN)

如果要在创建表之后执行此操作,可以在SQL Server Management Studio的表设计器中执行此操作:

alt text

答案 1 :(得分:8)

主键字段在MS SQL中不能包含空值。如果要填充SQL表并且不知道要为基于整数的主键字段输入什么,请将pk设置为Identity字段。另外,在指定Insert语句时,明智的做法是使用insert statment的列映射部分,例如:

Insert into (field1, field2, field3)
values
(value1, value2, value3)

这样做的原因是它确保列顺序是您为SQL管理员可以修改列顺序而开发的。它还允许您插入带有标识主键的行,而不指定主键示例

的值
CREATE TABLE [dbo].[foo](
    [fooid] [int] IDENTITY(1,1) NOT NULL,
    [name] [varchar](50) NULL,
 CONSTRAINT [PK_foo] PRIMARY KEY
(
        [fooid] ASC
)

现在我的插入语句很简单

Insert into foo (name)
values
("John")

表中的结果将是

1, "John"

答案 2 :(得分:4)

您可能没有(您忘记添加)在整数主键上设置自动增量。

答案 3 :(得分:3)

主键不应接受空值。为什么要将空值插入主键字段?主键字段应具有不可为空的唯一值,这将使表中的每个记录都唯一

答案 4 :(得分:2)

对于1个唯一行,您可以使用0而不是null,对于PK,则无法使用null。或者您可以省略PK并使用和自动增量PK字段

答案 5 :(得分:2)

假设您的主键有一个自动增量字段,您需要在插页中包含字段列表,而不是为该字段添加值。例如

INSERT INTO qcRawMatTestCharacteristic 
(Answer1,Answer2,...SomeDateField)
VALUES(1,1,1,1,1,1,1,'','','', GETDATE(), 1)

答案 6 :(得分:2)

我假设您真正的问题是您不确定如何编写插入语句以便PK自动填充正确?您需要为您设置值的字段命名,看起来您正试图设置所有这些字段,但只是像这样排除PK字段:

INSERT INTO someTable
(fieldName1, fieldName2) 
VALUES(1,1)

其中sometable是一个包含三个字段的表。 PK,fieldName1和fieldName2。您还需要确保PK字段上的identity属性设置为true。

答案 7 :(得分:0)

如果您有标识列,则无需在insert语句中指定它。

INSERT INTO qcRawMatTestCharacteristic  
VALUES(1,1,1,1,1,1,1,'','','', GETDATE(), 1) 

但是,如果您的主键不是标识列,那么您需要指定它,否则它将尝试插入空值,默认情况下主键是不可为空的。