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 - 它是主键的主要基本特征之一.
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的表设计器中执行此操作:

主键字段在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)