Datenbanken sind wohl aufgrund ihrer Geschwindigkeit und plattformübergreifenden Verfügbarkeit die sinnvollste Möglichkeit Daten zu hinterlegen. Da MySQL für ‚Insert‘ den Parameter ‚if not exists‘ nicht anbietet, wie MSSQL beispielsweise, bediene ich mich eines ‚OUTER JOINS‘. Zur Veranschaulichung mal das allseits beliebte Personalverwaltungsbeispiel:
create table personen (
p_id int(11) not null auto_increment primary key,
p_firstname varchar(25) not null,
p_lastname varchar(25) not null,
p_city varchar(50)not null,
p_email text not null
);
… und noch ein paar Daten:
insert into personen values (NULL , 'Peter', 'Klaasen', '012345 Norderdeich', ''),
(NULL , 'Kalsson', 'vom Dach', '08150 Lindgreen', 'Kalsson.vomdach@lindgreen.com');
In 2 Schritten doppelte Einträge zu vermeiden ginge natürlich auch und problemlos, aber – ich hätte es gern smart.
Zunächst noch eine Tabelle:
create table silentx (x int not null primary key);
insert into silentx(x) values (1);
Da die nette Kollegin aus der Personabteilung recht fit im Excel ist, gehe ich einfach mal von folgenden Importdaten aus -> ‘Priyesh;Piramoya;10696 Berlin;’
Der SQL-Query könnte dann wie folgt aussehen:
insert into personen (p_firstname,p_lastname,p_city,p_email)
select 'Priyesh','Piramoya','10696 Berlin','' from silentx
left outer join personen
on personen.p_firstname = 'Priyesh' AND personen.p_lastname = 'Piramoya' AND personen.p_city = '10696 Berlin' AND personen.p_email = ''
where silentx.x = 1 and personen.p_id is null;
Da der MySQL Syntax selber kein Geheimnis ist erspar ich mir mal nähere Erklärungen dazu. Letztendlich macht der Workaround erst im produktiven Umfeld mit Variablen Sinn. Abschließend sei aber noch ein MySQL Befehl erwähnt, der recht wenig Beachtung erhält und dennoch sehr hilfreich sein kann: EXPLAIN.
EXPLAIN select 'Priyesh','Piramoya','10696 Berlin','' from silentx
left outer join personen
on personen.p_firstname = 'Priyesh' AND personen.p_lastname = 'Piramoya' AND personen.p_city = '10696 Berlin' AND personen.p_email = ''
where silentx.x = 1 and personen.p_id is null;

