如何为同一数据库中的所有表设置唯一主键

4
如何为数据库中的所有表设置唯一主键?
例如,我不希望不同表之间重复使用任何主键。
table A:
----------
id | name
----------
1  | aaa
3  | bbb
5  | ccc

table B:
-------------
id | surname
-------------
7  | ddd
2  | eee
9  | fff

table C:
-------------
id | nickname
-------------
4  | ggg
6  | hhh
8  | iii

所有的id都是主键自动递增。所有数据都是动态输入的。我正在使用PHPMYADMIN中的MYSQL


如果您想通过查询插入id(通过删除auto_increment),那么是可以实现的。 - Himanshu
那就是问题所在...用户只会插入他/她的名字... - Harjeet Jadeja
没问题。用户不需要添加“ID”,它将由查询自动添加。请参见我的答案 - Himanshu
2
而且你为什么需要这个(在81个表上)? - ypercubeᵀᴹ
4个回答

5

您可以在模式中添加一个名为ID_Table的新表,该表将只有一个名为current_id的数值型列,其默认值为0。当向模式中的任何其他表添加新行时,必须在ID_Table上执行选择操作,返回ID_Table.current_id + 1作为新的ID值。然后,必须更新ID_Table

Update ID_Tableset ID_Table.current_id = ID_Table.current_id + 1 

GetNewId 函数可以通过锁定 ID_Table、更新 ID_Table 并返回 NewID 来实现。

类似于以下代码(使用 Oracle 语法):

create table ID_Table(
   current_id number
); 

Insert into ID_Table values(0);

CREATE OR REPLACE Function GetNewId RETURN number is
  new_id    ID_Table.current_id%type;
  row_count number;
begin
  select nvl(ID_Table.current_id, 0) + 1
    INTO new_id
    FROM ID_Table
     for update;
  update ID_Table set ID_Table.Current_Id = new_id;
  commit;

  RETURN new_id;
end GetNewId;

1
你可以从这三个表中获取最大的ID,然后将其添加到插入查询中。但是你必须删除auto_increment属性。
INSERT INTO TableA
SELECT MAX(ID)+1, 'jjj'
  FROM
      (SELECT MAX(ID) AS ID FROM TableA
       UNION
       SELECT MAX(ID) AS ID FROM TableB
       UNION
       SELECT MAX(ID) AS ID FROM TableC
      ) A;

查看这个 SQLFiddle


你好,针对这个包含3个表格的例子,你的回答是正确的。但是我有81个表格。我无法一直应用这个插入查询语句。 - Harjeet Jadeja

1
无论表格如何,对于每个插入的行,请使用与id生成器相同的序列。假设您正在使用允许将序列命名为字段id生成器的DB。
在MySQL中,这看起来像是可以实现您想要的:http://devzone.zend.com/1786/mysql-sequence-generator/

刚看到修改内容。看起来 MySQL 不允许使用具名序列……你是否正在使用 Hibernate 或其他对象关系框架? 如果是这样,你可以在框架内管理它,而不是在 RBDMS 中进行。 - EdH
也许这可以帮助定义一个命名序列,以在表之间共享,而不是在表上使用autoIncrement:http://en.latindevelopers.com/ivancp/2012/simulating-sequences-in-mysql/ - EdH
这似乎也是您想要的:http://devzone.zend.com/1786/mysql-sequence-generator/ - EdH

0

考虑使用序列。我不确定您使用的是哪种数据库。Postgresql和Oracle都有可以在表之间共享的序列。


你好,能否告诉我如何在MySQL中将相同的序列用于不同表的主键? - Harjeet Jadeja

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接