我有一张桌子,里面有很多遗失的身份ID。我还想以1开头回来。
DBCC CHECKIDENT('Customer', RESEED, 0)
但是,表格中有现有数据,这会影响到什么吗?
说我在表中有ID 2,3,5,其中1和4消失了。如果我执行上面的SQL,那是否会启动该表中的下一个新行为1,然后是4时的下一行而不打扰2,3,5等等?
答案 0 :(得分:1)
如果将列设置为唯一(主键或唯一约束),则尝试重新设置标识列的值,该值的值小于标识列中的最大值将导致错误。如果该列未设置为唯一,则该命令将按预期执行,但当您再次遇到这些ID时,您将获得重复值。换句话说,它不会在您的示例中跳过2,3和5。 See this link for more detail
答案 1 :(得分:1)
虽然缺少的ID在美学上并不令人满意,但它们对数据库性能完全没有影响。
如果您使用这些值向用户显示类似Customer Ref的内容,那么您应该为此使用单独的字段。不应依赖数据库ID进行显示,因为数据库的规则可能与您的客户参考规则等不同。
我建议如果你的问题是你为Customer Ref添加了一个额外的字段 - 用当前数据库ID作为默认值填充它,那么你可以对这个新字段做任何你想要的事情(就确保这一点而言)所有值都按顺序使用),不会干扰数据库的性能和完整性。
答案 2 :(得分:0)
使用现有数据在表上重新设置为0将导致现有ID重复或在唯一约束可用时引发错误。请参阅POC以进一步澄清相同的内容 的 TESTDATA:强>
IF OBJECT_ID(N'Table1') > 0
BEGIN
DROP TABLE Table1
END
CREATE TABLE Table1 (ID INT IDENTITY(1, 1),
Col1 VARCHAR(3))
INSERT INTO Table1
VALUES('1F'),('3A'),('2A'),('4G'),('5X')
SELECT * FROM Table1
DELETE FROM Table1
WHERE ID IN( 2, 4)
SELECT * FROM Table1
DBCC CHECKIDENT('Table1', RESEED, 0)
INSERT INTO Table1
VALUES ('12F'),('34A'),('23A'),('45G'),('56X')
SELECT *
FROM Table1
DELETE FROM Table1
DBCC CHECKIDENT('Table1', RESEED, 0)
ALTER TABLE Table1
ADD UNIQUE (Id)
INSERT INTO Table1
VALUES('1F'),('3A'),('2A'),('4G'),('5X')
SELECT * FROM Table1
DELETE FROM Table1
WHERE ID IN( 2, 4)
DBCC CHECKIDENT('Table1', RESEED, 0)
SELECT * FROM Table1
INSERT INTO Table1
VALUES ('12F'),('34A'),('23A'),('45G'),('56X')
IF OBJECT_ID(N'Table1') > 0
BEGIN
DROP TABLE Table1
END
IF OBJECT_ID(N'Table1') > 0
BEGIN
DROP TABLE Table1
END
答案 3 :(得分:0)
创建一个BackUp表:
Create table [dbo].[personbkp](
[Id] INT NOT NULL IDENTITY(1,1),
[name] NVARCHAR(MAX) NOT NULL
)
选择进入语句以保存数据:
SELECT p.name
INTO dbo.personbkp
FROM person p
GO
清洁表:
DELETE FROM person
重新设定种子:
DBCC CHECKIDENT('person', RESEED, 0)
使用BackUp:
SELECT bk.name
INTO dbo.person
FROM personbkp
Drop BackUp table:
DROP TABLE dbo.personbkp