在SQL Server 2008 R2中,我有一个允许0作为外键的表。这很奇怪,因为指定了主键约束,并且还使用了IDENTITY(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
首次创建数据库时清除数据库。这可能是负责任的吗?
答案 0 :(得分:1)
我知道重置PK的方法是:
a)使用截断器但是这样可以看到回到1 b)使用的东西例如:
DBCC CHECKIDENT(MyTable,RESEED,1)
如果在最后一个语句中使用了0而不是1,则将种子设置为0.
其他人在谈论这个。
http://social.msdn.microsoft.com/Forums/en-US/sqldatabaseengine/thread/ca0db3d2-e3ae-46ce-b8f0-bfc3bf95a509/
答案 1 :(得分:1)
你在RegionID中以0结尾的唯一原因是 -
当您截断表并使用以下命令将标识重新设置为0时
DBCC CHECKIDENT('tdfRegions', RESEED, 0)
如果随后使用插入块插入表中,则它将是RegionID = 0。