6 Werte in Tabellen einfügen

6.1 Daten importieren

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.

6.1.1 Das CSV-Format

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:

6.1.2 LOAD DATA INFILE

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:

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

6.1.3 Geänderte Werte importieren

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;

6.2 Daten anlegen

6.2.1 Wie lege ich mehrere Zeilen mit einem Befehl an?

Mit 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:

6.2.2 Wie kann ich eine einzelne Zeile anlegen?

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

6.2.3 Vorsicht Constraints!

Beim Einfügen von Daten müssen alle definierten Einschränkungen (Constraints) beachtet werden:

  1. NOT NULL Constraint:
-- Fehler, wenn geburtsdatum NOT NULL ist
INSERT INTO mitarbeiter (vorname, nachname) 
VALUES ('Max', 'Mustermann');
  1. UNIQUE Constraint:
-- Fehler bei doppelter E-Mail
INSERT INTO mitarbeiter (email) 
VALUES ('max@example.com');
  1. Fremdschlüssel-Constraint:
-- Fehler, wenn abteilung_id nicht existiert
INSERT INTO mitarbeiter (abteilung_id) 
VALUES (999);
  1. CHECK Constraint:
-- Fehler, wenn alter < 18
INSERT INTO mitarbeiter (alter) 
VALUES (16);

Umgang mit Constraint-Verletzungen:

  1. IGNORE verwenden:
INSERT IGNORE INTO mitarbeiter 
VALUES (1, 'Max', 'max@example.com');
  1. ON DUPLICATE KEY UPDATE:
INSERT INTO mitarbeiter 
VALUES (1, 'Max', 'max@example.com')
ON DUPLICATE KEY UPDATE 
    name = VALUES(name),
    email = VALUES(email);

6.3 Daten kopieren

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:

  1. Verwenden Sie Transaktionen bei mehreren INSERT-Befehlen:
START TRANSACTION;
INSERT INTO tabelle1 VALUES (...);
INSERT INTO tabelle2 VALUES (...);
COMMIT;
  1. Prüfen Sie die Daten vor dem Import:
-- Testlauf ohne Änderungen
SELECT * FROM mitarbeiter 
WHERE email IN (
    SELECT email FROM import_tabelle
);
  1. Beachten Sie die Performanz:
  1. Dokumentieren Sie Importvorgänge:
CREATE TABLE import_log (
    id INT AUTO_INCREMENT PRIMARY KEY,
    datum DATETIME,
    datei VARCHAR(255),
    anzahl_datensaetze INT,
    fehler_anzahl INT
);