Sql server 为什么此表允许PK id为0?
在SQL Server 2008 R2中,我有一个允许0作为外键的表。这很奇怪,因为指定了主键约束,并且还使用了Sql server 为什么此表允许PK id为0?,sql-server,sql-server-2008-r2,Sql Server,Sql Server 2008 R2,在SQL Server 2008 R2中,我有一个允许0作为外键的表。这很奇怪,因为指定了主键约束,并且还使用了标识(1,1)描述符 当第一条记录插入到表中时,它的PK(RegionID)为0 在执行插入时,我没有启用IDENTITY-INSERT。(正常操作) 以下是表格定义: CREATE TABLE [dbo].[tdfRegions]( [RegionID] [int] IDENTITY(1,1) NOT NULL, [RegionName] [nvarchar](50)
标识(1,1)
描述符
当第一条记录插入到表中时,它的PK(RegionID
)为0
在执行插入时,我没有启用IDENTITY-INSERT
。(正常操作)
以下是表格定义:
CREATE TABLE [dbo].[tdfRegions](
[RegionID] [int] IDENTITY(1,1) NOT NULL,
[RegionName] [nvarchar](50) NOT NULL,
[RegionDescription] [nvarchar](50) NOT NULL,
[Active] [bit] NOT NULL,
CONSTRAINT [PK_tdfRegions] PRIMARY KEY CLUSTERED
(
[RegionID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
我一直在假设插入到此表的第一条记录的RegionID
为1
INSERT INTO
tdfRegions (RegionName, RegionDescription, Active)
VALUES
('test','test', 1)
产生:
RegionID RegionName RegionDescription Active
0 test test 1
为什么会发生这种情况
编辑:
好的,我这里有更多的背景信息。有人跑了
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
GO
EXEC sp_MSForEachTable 'DELETE FROM ?'
GO
EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
GO
在首次创建数据库时清除该数据库。这有责任吗 我知道的重置PK的方法是:
a)使用truncate
但这会使see返回到1
b)使用类似的方法:
DBCC CHECKIDENT(MyTable,RESEED,1)
如果在上一个语句中使用0而不是1,则会将种子集设置为0。
其他人正在谈论这一点。
您在RegionID中可能以0结尾的唯一原因是-- 使用以下命令截断表并将标识重新设定为0时
DBCC CHECKIDENT('tdfRegions', RESEED, 0)
如果随后使用insert块插入到表中,它将是RegionID=0
检查是否有
而不是INSERT
触发器。如果在截断表tdfRegions
之后执行dbcc checkident(tdfRegions,reseed,0)
,您将得到一个0
作为第一个值。如果在从TDF区域删除后重新设定种子,则将是1
。是否要重新为表添加种子?此脚本显示在dbo.tdfRegions
表上创建的所有触发器:从sys.triggers t中选择t.is_而不是_trigger,t.*,其中t.parent_id=OBJECT_id(N'dbo.tdfRegions')代码>好-这很奇怪,我无法复制它-但为什么这是一个问题,真的?插入新行时,只需获取IDENTITY
列正在使用的任何值-我不在乎它是0、1、1000000还是其他值-它只是一个任意数字…marc_s-理解为什么会发生这种情况很重要;对所使用的技术没有一个良好的心智模型可能会导致你做出有害的假设。或者更简单的是,做“DBCC CHECKIDENT”(“tdfRegions”,RESEED)”。“重新设定种子”功能不需要新的“重新设定种子”值。你可能会认为它会回到原来的样子,但事实并非如此。如果未设置特定值,则会将其设置回0。