如何为数据库的所有表设置唯一的主键?
例如,我不想重复不同表的任何主键。
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 key
和auto_increment
。
所有数据都是动态输入的。我在MYSQL
中使用了PHPMYADMIN
。
答案 0 :(得分:5)
您可以向名为ID_Table
的架构中添加一个新表,该表只有一个名为current_id
的数字列,默认值为0,当向架构的任何其他表添加新行时必须在ID_Table上调用select 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
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 :(得分:1)
对于每个插入的行,使用与id生成器相同的序列,而不管表是什么。假设您使用的数据库允许将序列命名为该字段的id生成器。
看起来它会在MySQL中做你想做的事:http://devzone.zend.com/1786/mysql-sequence-generator/
答案 2 :(得分: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;
答案 3 :(得分:0)
看看使用序列。我不确定你使用的是什么数据库。 Postgresql和Oracle具有可以在表之间共享的序列。