Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Generieren Sie eine eindeutige AI-ID über mehrere Datentabellen hinweg

Ich verstehe Ihre Bedenken. Wenn Sie sich entschieden haben, Ihre Datenbank mit technischen IDs zu gestalten, besteht immer die Gefahr, IDs zu verwechseln. Während

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

statt

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

würde wahrscheinlich durch einen Fehler,

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

statt

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

wahrscheinlich nicht, und wenn Sie Ihren Programmfehler bemerken, kann es zu spät sein, um die schlechten Aufzeichnungen von den guten zu unterscheiden. Ihre Daten wären technisch konsistent, aber wirklich ein Durcheinander.

Um dieses Problem zu lösen, benötigen Sie eine Quelle, aus der Sie Ihre IDs abrufen können. In Oracle würden Sie beispielsweise eine Sequenz verwenden. In MySQL können Sie nur für diesen Zweck eine ID-Tabelle erstellen:

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

Wenn Sie also einen Datensatz in eine Ihrer Tabellen einfügen, müssen Sie eine ID angeben (weil sie nicht automatisch erhalten wird). Sie erhalten die ID mit einer Einfügung in Ihre IDs-Tabelle und rufen dann LAST_INSERT_ID() von MySQL auf.

Eine weniger sichere, aber einfachere Alternative wäre, die IDs an unterschiedlichen Offsets zu 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');

Dies funktioniert, solange Ihre IDs im gewünschten Bereich bleiben.