在两个表之间共享自动递增的主键

时间:2020-03-06 15:04:53  来源:igfitidea点击:

嗨,我想有两个表,每个表都有一个INT" id"列,该列将自动递增,但是我不希望其中一个" id"列共享相同的数字。这叫什么,什么是最好的方法?顺序?迭代器?指数?增量器?

动机:我们正在从一种模式迁移到另一种模式,并且拥有一个读取两个表并显示(int)ID的网页,但是我不能为两个表使用相同的ID。

我正在使用SQL Server 9.0.3068.

谢谢!

解决方案

我认为,如果我理解正确的话,使用GUID将是最直接的方法。

SELECT NEWID()

使用具有GUID(全局唯一标识符)类型的列。它是16字节,每行始终是唯一的。

请注意,与普通整数键相比,我们将获得显着的性能提升。

使用ID类型为int的ID密钥的另一个表,默认值为1,称为KeyID或者其他名称。

让存储过程检索该值,将其加1,然后更新KeyID,然后将其返回给存储过程,该过程将更新需要新的唯一键的两个表。

这将确保ID为int,并且在使用存储过程生成新ID的一组表之间是唯一的。

我不知道你会怎么称呼它。

如果我们不想使用GUID或者单独的表,则还可以创建一个函数,该函数查看两个表中ID的最大值并将其添加到该值(或者类似值)中。

然后,我们可以在两个表的插入触发器中调用该函数。

只需将身份增量配置为> 1,例如表一使用IDENTITY(1,10)[1,11,21 ...],表二使用IDENTITY(2,10)[2,12,22 ...]。如果以后需要,这也将为我们提供一些扩展的空间。

我个人是GUID解决方案的粉丝,但这是一个可行的选择。

许多解决此问题的方法都避免了GUID,并使用了良好的旧整数。这在合并复制情况下也很常见,在这种情况下,许多卫星站点与一个主站点合并,需要避免密钥冲突。

如果GUID对我们不起作用,并且我们绝对必须具有int,bigint等,则始终可以使用IDENTITY列,并使每个表的SEED值不同。这些数据类型的范围非常广,将范围划分为可用的段并不难,特别是如果我们只想进行两次拆分的话。例如,基本int的范围是-2 ^ 31(-2,147,483,648)到2 ^ 31 1(2,147,483,647)。例如,这对于客户表来说绰绰有余。

Transact-SQL参考(SQL Server 2000)
int,bigint,smallint和tinyint

例子:

--Create table with a seed of 1 billion and an increment of 1
CREATE TABLE myTable
(
primaryKey int IDENTITY (1000000000, 1),
columnOne varchar(10) NOT NULL
)

我们可以在第三个表中定义一个IDENTITY列,使用该列来生成ID值,但始终回滚我们对该表所做的所有插入操作(以避免使其增长)。回滚事务不会回滚生成ID的事实。

我不是Microsoft SQL Server的普通用户,因此请原谅任何语法错误。但是我想到的是以下内容:

CREATE TABLE AlwaysRollback (
  id IDENTITY(1,1)
);

BEGIN TRANSACTION;
INSERT INTO AllwaysRollBack () VALUES ();
ROLLBACK TRANSACTION;

INSERT INTO RealTable1 (id, ...) VALUES (SCOPE_IDENTITY(), ...);

BEGIN TRANSACTION;
INSERT INTO AllwaysRollBack () VALUES ();
ROLLBACK TRANSACTION;

INSERT INTO RealTable2 (id, ...) VALUES (SCOPE_IDENTITY(), ...);