【问题标题】:how to set unique primary key for all table in same database如何为同一数据库中的所有表设置唯一主键
【发布时间】:2013-05-11 06:54:59
【问题描述】:

如何为数据库的所有表设置唯一的主键?
例如我不想重复不同表的任何主键。

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 都是primary keyauto_increment。 所有数据都是动态输入的。我在PHPMYADMIN 中使用MYSQL

【问题讨论】:

  • 如果你想通过查询插入id(通过删除auto_increment)是可以的。
  • 这就是问题所在...用户只会插入他/她的名字...
  • 是的,为什么不呢。用户无需添加ID,它将通过查询自动添加。见my answer
  • 你为什么需要这个(在 81 张桌子上)?

标签: mysql sql database database-design


【解决方案1】:

您可以在架构中添加一个名为 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;

【讨论】:

    【解决方案2】:

    您可以从所有三个表中获得最大的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;
    

    See this SQLFiddle

    【讨论】:

    • 嗨.. 你的回答是好的,这个 3 表示例,但我有 81 个表。 ..我不能一直应用这个插入查询...
    【解决方案3】:

    对每个插入的行使用与 id 生成器相同的序列,而不管表如何。假设您使用的数据库允许将序列命名为字段的 id 生成器。

    这看起来会在 MySQL 中执行您想要的操作:http://devzone.zend.com/1786/mysql-sequence-generator/

    【讨论】:

    【解决方案4】:

    看看使用序列。我不确定您使用的是什么数据库。 Postgresql 和 Oracle 具有可以在表之间共享的序列。

    【讨论】:

    • 嗨..你能告诉我如何在MYSQL中对不同表的主键使用相同的序列...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    • 2020-06-16
    相关资源
    最近更新 更多