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

Nic*_*ick 18 sql sql-server database-design insert

我准备把这头发撕掉了.我对MS SQL很新,并且在任何地方都没有看过类似的帖子.

当我尝试做这样的声明时:

INSERT INTO qcRawMatTestCharacteristic 
VALUES(NULL, 1,1,1,1,1,1,1,'','','', GETDATE(), 1)
Run Code Online (Sandbox Code Playgroud)

我得到以下内容:

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

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

有任何想法吗!?

mar*_*c_s 51

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

请参阅:SQL by Design:如何选择主键

Never Null
没有主键值可以为null,也不能做任何事情来将主键呈现为null.这是ANSI,关系数据库管理系统(RDBMS)设计和SQL Server 支持的关系模型的不可侵犯的规则.

更新:好的,所以你想在SQL Server中使用"自动增量"主键.

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

 CREATE TABLE dbo.YourTable(ID INT IDENTITY, col1 INT, ..., colN INT)
Run Code Online (Sandbox Code Playgroud)

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

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

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

替代文字

  • @Nick:对MySQL的耻辱!这显然违反了关于关系模型的ANSI规则 (6认同)
  • 不是,MySQL确实如此. (4认同)
  • +1(确定答案).为了完整起见:`unique`键***通常包含`null`值(`primary`不能). (3认同)
  • @Nick&@Marc - 这没有任何意义.如果您确实拥有主键并且MySQL允许您插入空值,那么您已经击败了主键的点.这意味着您可以插入具有所有空值的多行,而无法唯一标识每一行.我想知道在MySQL中是否会忽略null并且它会自动增量.这就像是说你会给两个人提供相同的身份证号码.你会如何识别它们? (2认同)

Joh*_*ock 8

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

Insert into (field1, field2, field3)
values
(value1, value2, value3)
Run Code Online (Sandbox Code Playgroud)

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

CREATE TABLE [dbo].[foo](
    [fooid] [int] IDENTITY(1,1) NOT NULL,
    [name] [varchar](50) NULL,
 CONSTRAINT [PK_foo] PRIMARY KEY
(
        [fooid] ASC
)
Run Code Online (Sandbox Code Playgroud)

现在我的insert语句很简单

Insert into foo (name)
values
("John")
Run Code Online (Sandbox Code Playgroud)

表中的结果将是

1, "John"
Run Code Online (Sandbox Code Playgroud)