sql >> Databasteknik >  >> RDS >> Mysql

Generera unikt AI-ID över flera datatabeller

Jag förstår din oro. När du väl bestämmer dig för att designa din databas med tekniska ID:n finns det alltid risken att förväxla ID:n. Medan

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

istället för

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

skulle förmodligen genom ett fel,

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

istället för

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

skulle förmodligen inte göra det, och när du märker ditt programfel kan det vara för sent att skilja de dåliga posterna från de bra. Dina data skulle vara tekniskt konsekventa, men en enda röra.

För att lösa detta problem behöver du en källa att hämta dina ID:n från. I Oracle till exempel skulle du använda en sekvens. I MySQL kan du skapa en ID-tabell endast för detta ändamå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å närhelst du infogar en post i en av dina tabeller måste du ange ett ID (eftersom det inte hämtas automatiskt). Du får ID:t med en infogning i din ID-tabell och ringer sedan upp MySQL:s LAST_INSERT_ID().

Ett mindre säkert, men enklare alternativ skulle vara att starta ID:n med olika förskjutningar:

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

Detta fungerar så länge som dina ID:n stannar inom det önskade intervallet.



  1. Vad ersätter unikidentifierare i Mysql

  2. Redundanta data i uppdateringsutlåtanden

  3. I MySQL beräkna offset för en tidszon

  4. MYSQL Trunkerat felaktigt INTEGER-värdefel