生成独特的AI ID在多个数据表(Generate Unique AI ID over multip

2019-10-23 05:44发布

我设计一个数据库,但我来了个奋斗在这一刻,

目前,我有3个表:

  1. ex_artists
  2. ex_tracks
  3. ex_labels

现在,我想在整个这3个(或多个)表的唯一ID

所以,如果“实例艺术家”有ID“1”,然后“示例性的轨道”不能同时具有ID“1”,但应该得到ID“2”,因为“1”已经存在

大大预先感谢您!

Answer 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留在期望范围内工作。



Answer 2:

它不是我没看过你写的东西:>

但你并不需要跨越所有这些独特的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)参照完整性是由你,但如果你想我可以扑通它



文章来源: Generate Unique AI ID over multiple data tables