Häufig müssen größere Datenmengen aus bestehenden Dateien in die Datenbank importiert werden. MySQL bietet hierfür verschiedene Möglichkeiten, wobei der Import von CSV-Dateien am häufigsten verwendet wird.
CSV (Comma Separated Values) ist ein einfaches Textformat zur Speicherung tabellarischer Daten:
id,vorname,nachname,email
1,Max,Mustermann,max.mustermann@example.com
2,Erika,Musterfrau,erika.musterfrau@example.com
Wichtige Eigenschaften:
Der LOAD DATA INFILE Befehl ist die schnellste Methode
zum Importieren von CSV-Dateien:
LOAD DATA INFILE '/pfad/zur/datei.csv'
INTO TABLE mitarbeiter
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;Wichtige Optionen:
FIELDS TERMINATED BY - SpaltentrennzeichenENCLOSED BY - TextbegrenzungszeichenLINES TERMINATED BY - Zeilenende-ZeichenIGNORE n LINES - Überspringt die ersten n ZeilenBeispiel mit Spaltenzuordnung:
LOAD DATA INFILE '/pfad/zur/datei.csv'
INTO TABLE mitarbeiter
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(vorname, nachname, @email)
SET email = LOWER(@email);Für das Aktualisieren bestehender Datensätze beim Import:
LOAD DATA INFILE '/pfad/zur/datei.csv'
REPLACE INTO TABLE mitarbeiter
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;Alternativ mit IGNORE:
LOAD DATA INFILE '/pfad/zur/datei.csv'
IGNORE INTO TABLE mitarbeiter
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;REPLACE - Überschreibt bestehende DatensätzeIGNORE - Überspringt bestehende DatensätzeMit INSERT können mehrere Datensätze gleichzeitig
eingefügt werden:
INSERT INTO mitarbeiter (vorname, nachname, abteilung) VALUES
('Max', 'Mustermann', 'Vertrieb'),
('Erika', 'Musterfrau', 'Marketing'),
('John', 'Doe', 'IT');Vorteile:
Für einzelne Datensätze:
INSERT INTO mitarbeiter
(vorname, nachname, abteilung)
VALUES
('Max', 'Mustermann', 'Vertrieb');Alternative Schreibweise:
INSERT INTO mitarbeiter
SET
vorname = 'Max',
nachname = 'Mustermann',
abteilung = 'Vertrieb';Beim Einfügen von Daten müssen alle definierten Einschränkungen (Constraints) beachtet werden:
-- Fehler, wenn geburtsdatum NOT NULL ist
INSERT INTO mitarbeiter (vorname, nachname)
VALUES ('Max', 'Mustermann');-- Fehler bei doppelter E-Mail
INSERT INTO mitarbeiter (email)
VALUES ('max@example.com');-- Fehler, wenn abteilung_id nicht existiert
INSERT INTO mitarbeiter (abteilung_id)
VALUES (999);-- Fehler, wenn alter < 18
INSERT INTO mitarbeiter (alter)
VALUES (16);Umgang mit Constraint-Verletzungen:
INSERT IGNORE INTO mitarbeiter
VALUES (1, 'Max', 'max@example.com');INSERT INTO mitarbeiter
VALUES (1, 'Max', 'max@example.com')
ON DUPLICATE KEY UPDATE
name = VALUES(name),
email = VALUES(email);Daten können auch aus einer Tabelle in eine andere kopiert werden:
INSERT INTO mitarbeiter_archiv
SELECT * FROM mitarbeiter
WHERE austritt_datum IS NOT NULL;Mit Spaltenauswahl:
INSERT INTO mitarbeiter_export (name, email)
SELECT name, email
FROM mitarbeiter
WHERE abteilung = 'Vertrieb';Tipps für das Einfügen von Daten:
START TRANSACTION;
INSERT INTO tabelle1 VALUES (...);
INSERT INTO tabelle2 VALUES (...);
COMMIT;-- Testlauf ohne Änderungen
SELECT * FROM mitarbeiter
WHERE email IN (
SELECT email FROM import_tabelle
);CREATE TABLE import_log (
id INT AUTO_INCREMENT PRIMARY KEY,
datum DATETIME,
datei VARCHAR(255),
anzahl_datensaetze INT,
fehler_anzahl INT
);