使用SQL Server中的现有数据重新编辑1

时间:2014-07-31 03:30:34

标签: sql sql-server identity-column

我有一张桌子,里面有很多遗失的身份ID。我还想以1开头回来。

DBCC CHECKIDENT('Customer', RESEED, 0)

但是,表格中有现有数据,这会影响到什么吗?

说我在表中有ID 2,3,5,其中1和4消失了。如果我执行上面的SQL,那是否会启动该表中的下一个新行为1,然后是4时的下一行而不打扰2,3,5等等?

4 个答案:

答案 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