SQL Server中IDENTITY类型字段的Reset



 

在SQL Server中表的IDENTITY类型字段,提供了自动增量的功能,非常的方便。但是使用该字段时有一个不方便之处,就是有关联的初始化数据。考虑如下应用场景:

1. 【Master表】

MA_CATEGORY
Field NameTypeDescription
CategoryIdIDENTITY(1, 1) 
CategoryNamenvarchar(20) 
MA_ITEM
Field NameTypeDescription
ItemIdIDENTITY(1, 1) 
CategoryIdint所属Category
ItemNamenvarchar(20) 

2. 【初始化数据】

MA_CATEGORY
CategoryIdCategoryName
1设备
2材料
MA_ITEM
ItemIdCategoryIdItemName
11设备A
21设备B
32材料A
42材料B

3. 【SQL文】根据以上数据生成初始化SQL文:

SQL文
DELETE FROM MA_CATEGORY;
INSERT INTO MA_CATEGORY (CategoryName) VALUES('设备');
INSERT INOT MA_CATEGORY (CategoryName) VALUES('材料');
DELETE FROM MA_ITEM;
INSERT INTO MA_ITEM (CategoryId, ItemName) VALUES (1, '设备A');
INSERT INTO MA_ITEM (CategoryId, ItemName) VALUES (1, '设备B');
INSERT INTO MA_ITEM (CategoryId, ItemName) VALUES (2, '材料B');
INSERT INTO MA_ITEM (CategoryId, ItemName) VALUES (2, '材料B');

 

4. 【问题】以上SQL文在新建数据库第一次运行时完全正常,因为CategoryId是按照我们期望的那样被创建,但是当再次运行,就出错了,这时生成的CategoryId不再是我们期望的1与2了,也就是在MA_ITEM表中插入的数据没有正常关联到MA_Category表中的CategoryId。

5. 【对应】为了要解决这个问题,需要用到DBCC CheckIdent核对当前特定表的自动增量值,如果需要,可以纠正自动增量的值。

语法:

DBCC CHECKIDENT

    ( 'table_name'

        [ , { NORESEED

                | { RESEED [ , new_reseed_value ] }

            }

        ]

    )

参数:

tableName - 是检查当前自动增量的表名。此表名必需是符合的标示符。此表必需包含自动增量字段。

NORESEED - 当前特定自动增量的值不被纠正。

RESEED - 当前特定自动增量的值被纠正。

New_reseed_value - 重新设置自动增量字段的起初值。

修改后的SQL文:

SQL文
DELETE FROM MA_CATEGORY;
DBCC CHECKIDENT('MA_CATEGORY', RESEED, 0);
INSERT INTO MA_CATEGORY (CategoryName) VALUES('设备');
INSERT INOT MA_CATEGORY (CategoryName) VALUES('材料');
DBCC CHECKIDENT('MA_ITEM', RESEED, 0);
DELETE FROM MA_ITEM;
INSERT INTO MA_ITEM (CategoryId, ItemName) VALUES (1, '设备A');
INSERT INTO MA_ITEM (CategoryId, ItemName) VALUES (1, '设备B');
INSERT INTO MA_ITEM (CategoryId, ItemName) VALUES (2, '材料B');
INSERT INTO MA_ITEM (CategoryId, ItemName) VALUES (2, '材料B');



"雪见"杨幂邀你共品3D国韵网游《天下贰》,海报免费领
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值