当我尝试做这样的陈述时:
INSERT INTO qcRawMatTestCharacteristic
VALUES (NULL, 1, 1, 1, 1, 1, 1, 1, '', '', '', GETDATE(), 1)
我得到以下信息:
无法将 NULL 值插入 列“iRawMatTestCharacteristicId”, 桌子 'Intranet.dbo.qcRawMatTestCharacteristic'; 列不允许为空。插入 失败了。
我理解该错误,但 null 值适用于具有 int 数据类型的主字段。
有什么想法吗?
任何关系数据库中的主键都不允许为 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 的表设计器中执行此操作:
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"
INSERT INTO qcRawMatTestCharacteristic
(Answer1,Answer2,...SomeDateField)
VALUES(1,1,1,1,1,1,1,'','','', GETDATE(), 1)
INSERT INTO someTable
(fieldName1, fieldName2)
VALUES(1,1)
其中 sometable 是具有三个字段的表。 PK、字段名称 1 和字段名称 2。您还需要确保 PK 字段上的身份属性设置为 true。
INSERT INTO qcRawMatTestCharacteristic
VALUES(1,1,1,1,1,1,1,'','','', GETDATE(), 1)
但是,如果您的主键不是标识列,那么您确实需要指定它,因为否则它将尝试插入空值,并且默认情况下主键不可为空。