如何使用默认约束,触发器或其他某种机制自动从序列中将多个连续值插入到表的同一行的多个列中?使用序列填充连续值的多个列
SQL Server中序列的标准用法是将其与多个表上的默认约束组合,以基本上获得一个跨表标识。请参阅Microsoft文档文章“Sequence Numbers”中的“C.在多个表中使用序列号”一节。
如果您只想从插入的每行的序列中获取单个值,此功能非常有用。但有时我想获得多个连续的值。所以理论上我将创建一个这样的序列和表:
CREATE SEQUENCE DocumentationIDs;
CREATE TABLE Product
(
ProductID BIGINT NOT NULL IDENTITY(1, 1) PRIMARY KEY
, ProductName NVARCHAR(100) NOT NULL
, MarketingDocumentationID BIGINT NOT NULL DEFAULT (NEXT VALUE FOR DocumentationIDs)
, TechnicalDocumentationID BIGINT NOT NULL DEFAULT (NEXT VALUE FOR DocumentationIDs)
, InternalDocumentationID BIGINT NOT NULL DEFAULT (NEXT VALUE FOR DocumentationIDs)
);
不幸的是这将在所有三列中插入相同的值。这是by design:
如果对于函数指定单个Transact-SQL语句在同一个序列发生器的下一个值的多个实例,所有这些实例以供该处理的给定行返回相同的值的Transact SQL语句。这种行为符合ANSI标准。
增量由黑客
唯一suggestion我能在网上找到了用一个黑客,你必须通过你需要(我人为的例子三)插入的列数的顺序增量,手动添加到NEXT VALUE FOR
功能在默认约束:
CREATE SEQUENCE DocumentationIDs START WITH 1 INCREMENT BY 3;
CREATE TABLE Product
(
ProductID BIGINT NOT NULL IDENTITY(1, 1) PRIMARY KEY
, ProductName NVARCHAR(100) NOT NULL
, MarketingDocumentationID BIGINT NOT NULL DEFAULT (NEXT VALUE FOR DocumentationIDs)
, TechnicalDocumentationID BIGINT NOT NULL DEFAULT ((NEXT VALUE FOR DocumentationIDs) + 1)
, InternalDocumentationID BIGINT NOT NULL DEFAULT ((NEXT VALUE FOR DocumentationIDs) + 2)
)
但这不是为我工作,因为使用并不是所有的表我的SE quence需要相同数量的值。
无法你只是使用另一个序列的其他表?他们是如何相关的,他们需要相同的序列?第二种解决方案是增加最大数量的列像10,这应该满足所有表,但你会得到空白。 – lad2025