我正处于这样一种情况:我们将推出一个新的软件版本,它将使用旧版本的单独数据库(模式中的重大更改)。将会有相当长的一段时间,新系统和旧系统都将投入生产,我们需要确保在两个数据库之间生成唯一ID(我们不希望在数据库A中有一行)与数据库B中的行具有相同的ID。数据库是Sybase。
我想出的可能的解决方案:
我还能做什么?是否有更优雅的解决方案,两个数据库一起工作?我相信这两个数据库将在同一台服务器上,如果这很重要的话。
答案 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