在SQL Server中表的IDENTITY类型字段,提供了自动增量的功能,非常的方便。但是使用该字段时有一个不方便之处,就是有关联的初始化数据。考虑如下应用场景:
1. 【Master表】
MA_CATEGORY Field Name Type Description CategoryId IDENTITY(1, 1) CategoryName nvarchar(20)
MA_ITEM Field Name Type Description ItemId IDENTITY(1, 1) CategoryId int 所属Category ItemName nvarchar(20)
2. 【初始化数据】
MA_CATEGORY CategoryId CategoryName 1 设备 2 材料
MA_ITEM ItemId CategoryId ItemName 1 1 设备A 2 1 设备B 3 2 材料A 4 2 材料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国韵网游《天下贰》,海报免费领
本文讨论了在 SQL Server 中使用 IDENTITY 类型字段时遇到的初始化数据关联问题,并提供了使用 DBCC CHECKIDENT 语句解决此问题的方法。通过示例展示了如何正确地初始化和维护自动增量字段。
532

被折叠的 条评论
为什么被折叠?



