首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么这个表允许PK id为0?

为什么这个表允许PK id为0?
EN

Stack Overflow用户
提问于 2013-05-02 16:27:01
回答 2查看 111关注 0票数 0

在Server 2008 R2中,我有一个允许0作为外键的表。这很奇怪,因为指定了主键约束,并且还使用了IDENTITY(1,1)描述符。

当第一个记录被插入到表中时,它的PK (RegionID)是0。

我在做插入时没有打开IDENTITY-INSERT。(正常操作)

以下是表的定义:

代码语言:javascript
运行
复制
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。

代码语言:javascript
运行
复制
INSERT INTO 
    tdfRegions (RegionName, RegionDescription, Active) 
VALUES 
    ('test','test', 1)

生产:

代码语言:javascript
运行
复制
RegionID   RegionName   RegionDescription   Active
    0      test         test                   1

为什么会发生这种事?

编辑:

好的,我这里有一些背景信息。有人跑了一个

代码语言:javascript
运行
复制
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
GO
EXEC sp_MSForEachTable 'DELETE FROM ?'
GO
EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
GO

若要清除首次创建数据库时的数据,请执行以下操作。这可能是罪魁祸首?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-02 16:58:44

你能在RegionID中得到0的唯一原因是--

当您截断表并使用下面的命令将标识重新定位为0时

代码语言:javascript
运行
复制
DBCC CHECKIDENT('tdfRegions', RESEED, 0)

如果然后使用insert块插入到表中,则为RegionID = 0。

票数 1
EN

Stack Overflow用户

发布于 2013-05-02 16:50:16

我所知道的重置PK的方法是:

( a)使用截断

但这会让我们看到1

( b)使用类似于:

(MyTable,RESEED,1)

如果在最后一条语句中使用0而不是1,那么种子设置为0。

其他人在谈论这件事。

http://social.msdn.microsoft.com/Forums/en-US/sqldatabaseengine/thread/ca0db3d2-e3ae-46ce-b8f0-bfc3bf95a509/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16343123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档