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

Generer unikt AI ID over flere datatabeller

Jeg forstår dine bekymringer. Når du beslutter dig for at designe din database med tekniske ID'er, er der altid fare for at forvirre ID'er. Mens

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

i stedet for

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

ville sandsynligvis gennem en fejl,

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

i stedet for

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

ville sandsynligvis ikke, og når du bemærker din programfejl, kan det være for sent at fortælle de dårlige rekorder fra de gode. Dine data ville være teknisk konsistente, men virkelig et rod.

For at overvinde dette problem har du brug for én kilde at hente dine ID'er fra. I Oracle for eksempel ville du bruge en sekvens. I MySQL kan du oprette en ID-tabel kun til dette formål:

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

Så hver gang du indsætter en post i en af ​​dine tabeller, skal du angive et ID (fordi det ikke automatisk hentes). Du får ID'et med en indsættelse i din ID-tabel og ringer derefter til MySQL's LAST_INSERT_ID().

Et mindre sikkert, men enklere alternativ ville være at starte ID'erne ved forskellige forskydninger:

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

Dette virker, så længe dine id'er forbliver i det ønskede område.



  1. Indsæt kun, hvis værdier afviger fra den forrige post med multi-indsættelse?

  2. Oracle underforespørgsel kan ikke se variablen fra den ydre blok 2 niveauer og op

  3. Tilbage-knap til et enkeltsidet websted

  4. Trigger Insert med en SELECT/JOIN