sql >> Base de Datos >  >> RDS >> Mysql

Genere ID de AI únicos en múltiples tablas de datos

Entiendo tus preocupaciones. Una vez que decide diseñar su base de datos con identificaciones técnicas, siempre existe el peligro de confundir las identificaciones. Mientras

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

en lugar de

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

probablemente a través de un error,

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

en lugar de

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

probablemente no lo haría, y en el momento en que note el error de su programa, puede ser demasiado tarde para distinguir los registros malos de los buenos. Tus datos serían técnicamente consistentes, pero realmente un desastre.

Para superar este problema, necesita una fuente de donde extraer sus identificaciones. En Oracle, por ejemplo, usaría una secuencia. En MySQL puede crear una tabla de ID 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');

Entonces, siempre que inserte un registro en una de sus tablas, debe especificar una ID (porque no se obtiene automáticamente). Obtiene la ID con una inserción en su tabla de ID y luego llama a LAST_INSERT_ID() de MySQL.

Una alternativa menos segura, pero más simple, sería comenzar los ID en diferentes compensaciones:

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

Esto funciona siempre que sus identificaciones permanezcan en el rango deseado.