【问题标题】:SQL Server Identity column insertsSQL Server 标识列插入
【发布时间】:2021-08-03 05:06:02
【问题描述】:

我支持数据复制产品。我有一个客户非常沮丧,因为 SQL Server 不能有一个带有 Identity 列的表,当添加一行而不为该列提供值时会自动递增,同时会接受/使用一个值它是提供的——我可能会补充说,这两件事都以高速率连续发生,并跨越数百张桌子。他们指出其他显然可以做到这一点的数据库。

我在网上看到的一切和我自己的实验似乎都表明这根本无法在 SQL Server 中完成,但我想把它放在那里,以防我错了并且遗漏了一些东西。到目前为止,我对他们的唯一建议是切换到序列(而不是身份)并将其用作列的默认值。我已经对其进行了测试,它的工作原理完全符合他们的要求,但他们对为数百张桌子这样做的想法感到不满。谢谢。

【问题讨论】:

  • 编写一个脚本来转换 DML 以使用序列?如果他们不能被要求做出改变,那么他们就不会得到改变。他们不能只希望或要求功能存在。
  • 也许这是 OP 提出的 真正 问题,@MatBailie:“我如何为 ALTER 我的所有表格创建一个脚本,并使用 IDENTITY SEQUENCE?”当然,答案并不简单;特别是如果这些列是主键,并由外键引用。
  • @larnu 确实,可能是这样。如果是这样,那应该是问题。

标签: sql-server etl database-replication identity-column


【解决方案1】:

IDENTITY 的意义在于 SQL Server 可以控制它;您让 SQL Server 完全管理该值。您真正想要的是SEQUENCE 作为DEFAULT 值。

CREATE TABLE dbo.SomeTable (ID int NOT NULL,
                            SomeColumn varchar(10));
GO
CREATE SEQUENCE dbo.SomeTableID START WITH 1 INCREMENT BY 1;
GO
ALTER TABLE dbo.SomeTable ADD CONSTRAINT PK_SomeTable PRIMARY KEY CLUSTERED (ID);
ALTER TABLE dbo.SomeTable ADD CONSTRAINT DF_SomeTableID DEFAULT NEXT VALUE FOR dbo.SomeTableID FOR ID;
GO
INSERT INTO dbo.SomeTable (SomeColumn)
VALUES ('abc'),('def');
GO
INSERT INTO dbo.SomeTable(ID,SomeColumn)
VALUES(3,'xyz');
GO
--Errors due to 3 already in use, but intended.
INSERT INTO dbo.SomeTable (SomeColumn)
VALUES ('abc');
GO
INSERT INTO dbo.SomeTable (SomeColumn)
VALUES ('def'); --4
GO

--Cleanup
DROP TABLE dbo.SomeTable;
DROP SEQUENCE dbo.SomeTableID;

db<>fiddle

【讨论】:

  • 是的——我同意这个顺序——而且我知道怎么做——我只是在做一些尽职调查,以确保“身份”列没有办法。
  • 不,@KenM,没有。通过使用IDENTITY,您表示您希望 SQL Server 控制该值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-28
  • 2016-10-18
  • 1970-01-01
  • 2013-08-02
  • 2023-03-18
  • 2020-04-02
相关资源
最近更新 更多