0

在 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 

我一直在假设插入到该表的第一条记录的 aRegionID为 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

首次创建时清除数据库。这可能是负责任的吗?

4

2 回答 2

1

我知道重置 PK 的方法是:

a)使用 truncate
但这会使看到回到 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/

于 2013-05-02T16:50:16.400 回答
1

您最终可能在 RegionID 中得到 0 的唯一原因是——

当您使用以下命令截断表并将身份重新设置为 0 时

DBCC CHECKIDENT('tdfRegions', RESEED, 0)

如果您随后使用插入块插入到表中,则 RegionID = 0。

在此处输入图像描述

于 2013-05-02T16:58:44.970 回答