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

Wie kann ich in MySQL "einfügen, wenn nicht vorhanden" ausführen?

Verwenden Sie INSERT IGNORE INTO table .

Es gibt auch INSERT … ON DUPLICATE KEY UPDATE Syntax, und Sie finden Erklärungen in 13.2.6.2 INSERT ... ON DUPLICATE KEY UPDATE-Anweisung .

Beitrag von bogdan.org.ua gemäß Webcache von Google :

18. Oktober 2007

Zum Anfang:Ab dem neuesten MySQL ist die im Titel dargestellte Syntax nicht möglich. Aber es gibt mehrere sehr einfache Wege, um das zu erreichen, was mit vorhandener Funktionalität erwartet wird.

Es gibt 3 mögliche Lösungen:Verwenden von INSERT IGNORE, REPLACE oder INSERT … ON DUPLICATE KEY UPDATE.

Stellen Sie sich vor, wir haben eine Tabelle:

CREATE TABLE `transcripts` (
`ensembl_transcript_id` varchar(20) NOT NULL,
`transcript_chrom_start` int(10) unsigned NOT NULL,
`transcript_chrom_end` int(10) unsigned NOT NULL,
PRIMARY KEY (`ensembl_transcript_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Stellen Sie sich nun vor, dass wir eine automatische Pipeline haben, die Transkriptionsmetadaten aus Ensembl importiert, und dass die Pipeline aus verschiedenen Gründen bei jedem Ausführungsschritt unterbrochen werden könnte. Daher müssen wir zwei Dinge sicherstellen:

  1. wiederholte Ausführungen der Pipeline zerstören nicht unsere>Datenbank
  1. Wiederholte Ausführungen werden nicht aufgrund von Fehlern wegen „doppelter> Primärschlüssel“ abgebrochen.

Methode 1:Verwenden von REPLACE

Ganz einfach:

REPLACE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;

Wenn der Datensatz existiert, wird er überschrieben; wenn es noch nicht existiert, wird es erstellt. Die Verwendung dieser Methode ist jedoch in unserem Fall nicht effizient:Wir müssen vorhandene Datensätze nicht überschreiben, es ist in Ordnung, sie einfach zu überspringen.

Methode 2:mit INSERT IGNORE Auch sehr einfach:

INSERT IGNORE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;

Wenn die „ensembl_transcript_id“ bereits in der Datenbank vorhanden ist, wird sie stillschweigend übersprungen (ignoriert). (Um genauer zu sein, hier ein Zitat aus dem MySQL-Referenzhandbuch:„Wenn Sie das IGNORE-Schlüsselwort verwenden, werden Fehler, die während der Ausführung der INSERT-Anweisung auftreten, stattdessen als Warnungen behandelt. Beispielsweise wird ohne IGNORE eine Zeile, die einen vorhandenen UNIQUE-Index oder PRIMARY KEY dupliziert Wert in der Tabelle verursacht einen Doppelschlüsselfehler und die Anweisung wird abgebrochen.”.) Wenn der Datensatz noch nicht existiert, wird er erstellt.

Diese zweite Methode hat mehrere potenzielle Schwächen, einschließlich des Nichtabbruchs der Abfrage, falls ein anderes Problem auftritt (siehe Handbuch). Daher sollte es verwendet werden, wenn es zuvor ohne das Schlüsselwort IGNORE getestet wurde.

Methode 3:mit INSERT … ON DUPLICATE KEY UPDATE:

Die dritte Option ist die Verwendung von INSERT … ON DUPLICATE KEY UPDATE Syntax, und im UPDATE-Teil tun Sie einfach nichts, führen Sie eine bedeutungslose (leere) Operation aus, wie die Berechnung von 0 + 0 (Geoffray schlägt vor, die ID =ID-Zuweisung vorzunehmen, damit die MySQL-Optimierungs-Engine diese Operation ignoriert). Vorteil dieser Methode ist, dass sie nur Duplicatekey-Ereignisse ignoriert und trotzdem bei anderen Fehlern abbricht.

Als letzte Anmerkung:Dieser Beitrag wurde von Xaprb inspiriert. Ich würde auch empfehlen, seinen anderen Beitrag zum Schreiben flexibler SQL-Abfragen zu konsultieren.