在多个数据表上生成唯一的AI ID

时间:2015-05-30 15:34:50

标签: mysql mysqli mysql-workbench

我正在设计一个数据库,但此刻我才开始奋斗,

目前我有3张桌子:

  1. ex_artists
  2. ex_tracks
  3. ex_labels
  4. 现在我希望在这3个(或更多)表格中拥有唯一ID

    因此,如果'示例艺术家'的ID为'1',则'示例曲目'也不能具有ID'1' 但是因为'1'已经存在所以应该得到ID'2'

    提前谢谢你!

2 个答案:

答案 0 :(得分:1)

并不是我没有读过您所写的内容:>

但是你并不需要在它们之间使用唯一的ID,只是识别行的唯一方法。

考虑以下事项:

-- drop table artist
create table artist
( 
artist_id int unsigned auto_increment PRIMARY KEY,
artist_name varchar(255) not null
);

insert into artist (artist_name) values ('U2');
insert into artist (artist_name) values ('Cranberries');

-- drop table label
create table label
(
label_id int unsigned auto_increment PRIMARY KEY,
artist_id int not null, -- will leave FK RI to developer
label_name varchar(255) not null,
release_date datetime not null
);

insert into label(artist_id,label_name,release_date) values (1,'Boy','1980-10-20');
insert into label(artist_id,label_name,release_date) values (2,'No Need to Argue','1994-10-03');

create table track
(
id int unsigned auto_increment PRIMARY KEY, -- not completely necessary, will explain
track_id int not null,  -- u number this 1 to n consistent with label layout
label_id int not null, -- will leave FK RI to developer
track_name varchar(255) not null
);

-- Cranberries:
insert track (track_id,label_id,track_name) values (1,2,'Zombie');

-- U2:
insert track (track_id,label_id,track_name) values (1,1,'I Will Follow');
insert track (track_id,label_id,track_name) values (2,1,'Twilight');

-- select * from track

艺术家和品牌相当明显。跟踪不需要' id'专栏,但无论如何我扔了它。也就是说,可以将曲目标识为艺术家/标签ID的组合

外键(FK)参照完整性取决于您,但如果您愿意,我可以将其填入

答案 1 :(得分:1)

我了解您的疑虑。一旦您决定使用技术ID设计数据库,总会存在混淆ID的危险。而

insert into album_track (album, artist, track, no) 
  values ('B0016991-00', 'JBIEBER', 'BOYFRIEND0001', 2);

而不是

insert into album_track (album, artist, track, no) 
  values ('B0016991-00', 'BOYFRIEND0001', 'JBIEBER', 2);

可能会出错,

insert into album_track (album_id, artist_id, track_id, no) values (40, 22, 12, 2);

而不是

insert into album_track (album_id, artist_id, track_id, no) values (40, 12, 22, 2);

可能不会,而且当你注意到你的程序错误时,告诉好的记录可能为时已晚。你的数据在技术上是一致的,但真的很乱。

要解决此问题,您需要一个来源来提取您的ID。例如,在Oracle中,您将使用序列。在MySQL中,您可以仅为此目的创建一个ID表:

create table ids(id int auto_increment primary key);
create table album(id int primary key, album_no text, album_name text,
  foreign key (id) references ids(id));
create table track(id int primary key, track_name text, record_date date, take int, 
  foreign key (id) references ids(id));
insert into ids values ();
insert into album (id, album_no, album_name) values
  ((select last_insert_id), 'B0016991-00', 'Justin Bieber – Believe - Deluxe Edition');

因此,无论何时在其中一个表中插入记录,都必须指定一个ID(因为它不会自动获取)。您可以通过插入ID表获取ID,然后调用MySQL的LAST_INSERT_ID()。

不太安全但更简单的替代方案是在不同的偏移处启动ID:

create table album(id int auto_increment primary key, album_no text, album_name text);
create table track(id int auto_increment primary key, track_name text, record_date date);
alter table track auto_increment=10000001;
create table artist(id int auto_increment primary key, artist_name varchar(100));
alter table artist auto_increment=20000001;
insert into artist (artist_name) values ('Justin Bieber');

只要您的ID保持在所需范围内,此功能就可以使用。