Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Gere ID de IA exclusivo em várias tabelas de dados


Eu entendo suas preocupações. Depois de decidir projetar seu banco de dados com IDs técnicos, sempre existe o perigo de confundir IDs. Enquanto
insert into album_track (album, artist, track, no) 
  values ('B0016991-00', 'JBIEBER', 'BOYFRIEND0001', 2);

ao invés de
insert into album_track (album, artist, track, no) 
  values ('B0016991-00', 'BOYFRIEND0001', 'JBIEBER', 2);

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

ao invés de
insert into album_track (album_id, artist_id, track_id, no) values (40, 12, 22, 2);

provavelmente não, e quando você notar o erro do seu programa, pode ser tarde demais para diferenciar os registros ruins dos bons. Seus dados seriam tecnicamente consistentes, mas realmente uma bagunça.

Para superar esse problema, você precisa de uma fonte para extrair seus IDs. No Oracle, por exemplo, você usaria uma sequência. No MySQL você pode criar uma tabela de IDs para este único propósito:
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');

Portanto, sempre que você inserir um registro em uma de suas tabelas, deverá especificar um ID (porque ele não é obtido automaticamente). Você obtém o ID com uma inserção em sua tabela de IDs e então chama LAST_INSERT_ID() do MySQL.

Uma alternativa menos segura, mas mais simples, seria iniciar os IDs em diferentes deslocamentos:
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');

Isso funciona desde que seus IDs permaneçam no intervalo desejado.