在两个表之间共享自动递增的主键
嗨,我想有两个表,每个表都有一个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(), ...);