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_ 所有数据都是动态输入的。我正在使用.primary keyauto_incrementMYSQLPHPMYADMIN

4

4 回答 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;
于 2013-05-11T18:17:12.663 回答
1

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

这看起来会在 MySQL 中做你想做的事:http: //devzone.zend.com/1786/mysql-sequence-generator/

于 2013-05-11T06:57:59.597 回答
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

于 2013-05-11T07:19:51.123 回答
0

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

于 2013-05-11T06:58:08.360 回答