我有两个表,都有自动递增的主键,我希望两个表之间的id是唯一的 - 即没有两个相等的值将用作这些表的主键。
为了把它放到上下文中,我想做一些类似于Facebook正在使用他们的ID做的事情 - 在用户,页面,事件等之间共享它们。另外,我想确保我将来可以扩展系统。
我现在有三个想法,并且不能决定选择其中一个。
将ID增加10并从不同的值开始 - 即表A:1,11,21 ....&表B:2,12,22 - 由于你丢失了很多id,这有点愚蠢
使用GUID - 我想我可以做得更好
对id列使用unsigned bigint,从一个表开始,另一个表从足够大的数字开始
最好的方法是什么?或者还有另一种方式吗?
谢谢!
答案 0 :(得分:2)
创建名为ID或类似名称的第三个表。那将是唯一一个带有auto_increment的表。它只会用于生成ID,所以你可以这样:
insert into ids (id) values (null);
@id = select LAST_INSERT_ID();
insert into users (id, name) values (@id, "Andreas ");
对于需要id的所有其他表也是如此。您可以随时添加第三个表。
如果您希望甚至可以在ids表中保存关于该行包含哪一个表的信息。
insert into ids (id, table) values (null, "users");
@id = select LAST_INSERT_ID();
insert into users (id, name) values (@id, "Andreas ");
答案 1 :(得分:0)
使用GUIDs / UUID或某种维护自己的密钥表的requestUniqueKey存储过程。不幸的是,据我所知,没有推荐的方法如何在MySQL中存储UUID(如MS SQL Server中的UNIQUEIDENTIFIER)。
答案 2 :(得分:0)
所有这些都很好。
您可以使用选项1而不会丢失任何键,方法是将增量设置为2,将第一个表的起始偏移量设置为1,将第二个表的起始偏移量设置为2。表1的ID将为1,3,5 ......而表2将为2,4,6 ......
3基本上与选项1完全相同。虽然我不喜欢在我的代码中跟踪一些神奇数字的想法,如果我需要区分我代码中每个表的ID。
GUID也很好。它们速度较慢,需要更多存储空间,但实际上您可能没有注意到任何差异。如果你没有注意到你的申请有什么不同,谁在乎呢?