Mysql
 sql >> Database >  >> RDS >> Mysql

Genera ID AI univoco su più tabelle di dati

Capisco le tue preoccupazioni. Una volta che decidi di progettare il tuo database con ID tecnici, c'è sempre il pericolo di confondere gli ID. Mentre

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

invece di

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

probabilmente per un errore,

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

invece di

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

probabilmente non lo sarebbe, e nel momento in cui si nota l'errore del programma potrebbe essere troppo tardi per distinguere i record cattivi da quelli buoni. I tuoi dati sarebbero tecnicamente coerenti, ma davvero un pasticcio.

Per superare questo problema, hai bisogno di una fonte da cui estrarre i tuoi ID. In Oracle, ad esempio, useresti una sequenza. In MySQL puoi creare una tabella ID solo per questo scopo:

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

Quindi ogni volta che inserisci un record in una delle tue tabelle, devi specificare un ID (perché non viene ottenuto automaticamente). Ottieni l'ID con un inserto nella tabella degli ID e quindi chiami LAST_INSERT_ID() di MySQL.

Un'alternativa meno sicura, ma più semplice, sarebbe quella di avviare gli ID a diversi offset:

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

Funziona finché i tuoi ID rimangono nell'intervallo desiderato.