sql >> Database >  >> RDS >> Mysql

Genereer een unieke AI-ID over meerdere gegevenstabellen

Ik begrijp uw zorgen. Als u eenmaal besluit uw database te ontwerpen met technische ID's, bestaat altijd het gevaar dat ID's worden verward. Terwijl

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

in plaats van

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

zou waarschijnlijk door een fout,

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

in plaats van

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

waarschijnlijk niet, en op het moment dat u uw programmafout opmerkt, kan het te laat zijn om de slechte records van de goede te onderscheiden. Je gegevens zouden technisch consistent zijn, maar echt een puinhoop.

Om dit probleem op te lossen, hebt u één bron nodig om uw ID's uit te halen. In Oracle zou je bijvoorbeeld een reeks gebruiken. In MySQL kunt u alleen voor dit doel een ID-tabel maken:

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

Dus wanneer u een record in een van uw tabellen invoegt, moet u een ID opgeven (omdat deze niet automatisch wordt gekregen). Je krijgt de ID met een insert in je IDs-tabel en roept vervolgens MySQL's LAST_INSERT_ID() aan.

Een minder veilig, maar eenvoudiger alternatief zou zijn om de ID's op verschillende offsets te starten:

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

Dit werkt zolang uw ID's binnen het gewenste bereik blijven.



  1. Hoe MySQL-triggers in bulk te veranderen DEFINER

  2. SQL-UPDATE

  3. SQL GROUP BY-clausule voor beginners

  4. oracle 11g en integratie van winterslaapveer en jsf