我准备把这头发撕掉了。我是MS SQL的新手,并没有在任何地方看过类似的帖子。
当我尝试做这样的陈述时:
INSERT INTO qcRawMatTestCharacteristic
VALUES(NULL, 1,1,1,1,1,1,1,'','','', GETDATE(), 1)
我得到以下内容:
无法将值NULL插入 列'iRawMatTestCharacteristicId', 表 'Intranet.dbo.qcRawMatTestCharacteristic'; 列不允许空值。插入 失败。
我理解错误,但是null值是我的主要字段的int数据类型。
任何想法!?
答案 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的表设计器中执行此操作:
答案 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)
但是,如果您的主键不是标识列,那么您需要指定它,否则它将尝试插入空值,默认情况下主键是不可为空的。