防止多个数据库之间的重复键

时间:2009-05-01 14:34:08

标签: database primary-key sybase

我正处于这样一种情况:我们将推出一个新的软件版本,它将使用旧版本的单独数据库(模式中的重大更改)。将会有相当长的一段时间,新系统和旧系统都将投入生产,我们需要确保在两个数据库之间生成唯一ID(我们不希望在数据库A中有一行)与数据库B中的行具有相同的ID。数据库是Sybase。

我想出的可能的解决方案:

  1. 使用支持非常大数字的数据类型并为每个数据分配一个范围,希望它们永远不会溢出。
  2. 对一个数据库使用负值,对另一个数据库使用正值。
  3. 添加标识数据库的附加列,并使用该列和当前ID的组合作为密钥。
  4. 惊魂。
  5. 我还能做什么?是否有更优雅的解决方案,两个数据库一起工作?我相信这两个数据库将在同一台服务器上,如果这很重要的话。

7 个答案:

答案 0 :(得分:6)

在这种情况下,GUID或全局唯一ID可以是方便的主键。我相信Sybase支持他们。

编辑:虽然如果你的整个数据库已经基于整数主键,那么切换到GUID可能不太实际 - 在这种情况下,只需在数据库之间划分整数空间,就像GWLlosa和其他人所建议的那样。

答案 1 :(得分:5)

我已经看过几次了。在我参与的那些中,我们只是为旧的ID空间分配了一个足够大的ID空间(因为它已经运行了一段时间,我们知道它使用了多少个键,我们可以计算出它有多少个键'需要一个指定的'寿命')并启动上面新数据库的“ID SEQUENCE”。

我建议不要使用任何其他技巧,只是因为它们都需要更改“遗留”应用,这是一种风险,我认为没有必要采取。

答案 2 :(得分:3)

在您的情况下,我会考虑使用uniqueidentifier(GUID)作为数据类型。使用system function newid()创建它们时,它们被视为唯一。

CREATE TABLE customer (
   cust_key UNIQUEIDENTIFIER NOT NULL
            DEFAULT NEWID( ),
   rep_key VARCHAR(5),
   PRIMARY KEY(cust_key))

答案 3 :(得分:2)

在合并新数据库之前,使用的#大于旧数据库的数量。

我过去做过这个并且记录量相当低,所以我以200,000开始新数据库作为初始记录号。然后,当时间到了,我只是将所有旧记录迁移到新系统中。

完美地完成了工作!

答案 4 :(得分:2)

GUID是针对这种情况而设计的。

答案 5 :(得分:2)

如果您要在每个数据库上创建相似数量的新项目,则可以在一个数据库上尝试 even ids ,在另一个数据库中尝试奇数ID

答案 6 :(得分:1)

使用UNIQUEIDENTIFIER数据类型。我知道它在MS SQL Server中有效,据我在Googling中看到,Sybase支持它。

http://www.ianywhere.com/developer/product_manuals/sqlanywhere/0902/en/html/dbrfen9/00000099.htm