Mysql
 sql >> Base de données >  >> RDS >> Mysql

Générer un ID AI unique sur plusieurs tables de données

Je comprends vos préoccupations. Une fois que vous décidez de concevoir votre base de données avec des identifiants techniques, il y a toujours le risque de confondre les identifiants. Pendant que

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

au lieu de

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

serait probablement par une erreur,

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

au lieu de

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

ne le serait probablement pas, et le moment où vous remarquerez votre erreur de programme, il sera peut-être trop tard pour distinguer les mauvais enregistrements des bons. Vos données seraient techniquement cohérentes, mais vraiment en désordre.

Pour surmonter ce problème, vous avez besoin d'une source à partir de laquelle extraire vos identifiants. Dans Oracle, par exemple, vous utiliseriez une séquence. Dans MySQL, vous pouvez créer une table d'ID dans ce seul but :

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');

Ainsi, chaque fois que vous insérez un enregistrement dans l'une de vos tables, vous devez spécifier un ID (car il n'est pas obtenu automatiquement). Vous obtenez l'ID avec une insertion dans votre table d'ID, puis appelez LAST_INSERT_ID() de MySQL.

Une alternative moins sûre, mais plus simple, consisterait à démarrer les identifiants à différents décalages :

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');

Cela fonctionne tant que vos identifiants restent dans la plage souhaitée.