Ich versuche die folgende Abfrage auszuführen:
INSERT INTO table_listnames (name, address, tele)
VALUES ('Rupert', 'Somewhere', '022')
WHERE NOT EXISTS (
SELECT name FROM table_listnames WHERE name='value'
);
Dies gibt jedoch einen Fehler zurück. Grundsätzlich möchte ich keinen Datensatz einfügen, wenn das Feld 'Name' des Datensatzes bereits in einem anderen Datensatz vorhanden ist. Wie kann ich überprüfen, ob der neue Name eindeutig ist?
Antworten:
Ich schlage nicht vor, dass Sie dies tun, da der
UNIQUE
von Piskvor und anderen vorgeschlagene Index ein weitaus besserer Weg ist, dies zu tun, aber Sie können tatsächlich das tun, was Sie versucht haben:Datensatz einfügen:
Versuchen Sie erneut, denselben Datensatz einzufügen:
Fügen Sie einen anderen Datensatz ein:
Und so weiter...
Aktualisieren:
Um
#1060 - Duplicate column name
Fehler zu vermeiden , falls zwei Werte gleich sind, müssen Sie die Spalten des inneren SELECT benennen:quelle
name
in diesem Fall), nach Möglichkeit indizieren . Beachten Sie auch, dass Sie diesSELECT 'John', 'Doe', '022' FROM table_listnames
anstelle vonSELECT * FROM (SELECT 'John', 'Doe', '022') AS tmp
- tun können, dies funktioniert jedoch nur, wenntable_listnames
bereits eine oder mehrere Zeilen enthalten sind. Ich bezweifle, dass die Geschwindigkeit anders ist, also ist es wahrscheinlich kein Problem.WHERE
Anweisung gehört zurSELECT
Abfrage. Die Select-Abfrage gibt entweder eine einzelneSELECT 'Humbert', 'Humbert', '1'
in der inneren Auswahl). Ich erhalteERROR 1060 (42S21): Duplicate column name
#1060 - Duplicate column name
. Haben Sie eine Lösung gefunden? Edit: Gefunden. Fügen Sie hinter jedem Wert ein AS hinzu:SELECT * FROM (SELECT 'Rupert' as name, 'Rupert' as friend, '022' as number) AS tmp
INSERT erlaubt keine
WHERE
Syntax .Was Sie tun können: Erstellen Sie ein
UNIQUE INDEX
Feld, das eindeutig sein sollte (name
), und verwenden Sie dann entweder:INSERT
(und behandeln Sie den Fehler, wenn der Name bereits existiert)INSERT IGNORE
(was imStillen fehlschlägt undeine Warnung (anstelle eines Fehlers) verursacht, wenn der Name bereits vorhanden ist)INSERT ... ON DUPLICATE KEY UPDATE
(wirdUPDATE
am Ende ausgeführt, wenn der Name bereits vorhanden ist, siehe Dokumentation )quelle
mysql> show warnings\G
INSERT IGNORE
entspricht dem^Duplicate entry '.+' for key '.+'$
INSERT IGNORE
IMO.Hat funktioniert :
quelle
MySQL bietet eine sehr nette Lösung:
Sehr einfach zu bedienen, da Sie einen eindeutigen Primärschlüssel deklariert haben (hier mit Wert 5).
quelle
Hier die MySQL-Abfrage, die Datensätze einfügt, wenn sie nicht vorhanden sind, und vorhandene ähnliche Datensätze ignoriert.
quelle
INSERT IGNORE INTO `mytable` (`field0`, `field1`, `field2`) values ('2', 12345, 12678);
?INSERT [...] IGNORE INTO mytable VALUES ...
oderINSERT [...] IGNORE INTO mytable SET col_name={expr | DEFAULT},...
Sie können einfach den folgenden Weg verwenden:
Auf diese Weise können Sie neue Rohdaten einfügen und bei doppelten Daten eine bestimmte Spalte ersetzen (die besten Spalten sind Zeitstempel).
Beispielsweise :
quelle
Wenn Sie wirklich keinen eindeutigen Index für die Tabelle erhalten können, können Sie versuchen ...
quelle
Um ein ähnliches Problem zu lösen, habe ich die Tabelle so geändert, dass sie eine eindeutige Spalte enthält. Anhand Ihres Beispiels hätte ich bei der Erstellung Folgendes:
Verwenden Sie dann beim Einfügen die folgende Abfrage:
quelle
Diese Abfrage funktioniert gut:
Und Sie können die Tabelle mit folgender Abfrage erstellen:
Hinweis: Erstellen Sie eine Tabelle mit der zweiten Abfrage, bevor Sie versuchen, die erste Abfrage zu verwenden.
quelle
Brian Hooper: Sie haben fast den Punkt erreicht, aber Sie haben einen Fehler in Ihrer Synatx. Ihre Beilage wird niemals funktionieren. Ich habe in meiner Datenbank getestet und hier ist die richtige Antwort:
Ich gebe Ihnen mein Beispiel für einen Tisch. Das Einfügen ist fast das gleiche wie das, was Bian Hooper geschrieben hat, außer dass ich die Auswahl FROM DUAL aus einer anderen Tabelle übernommen habe. Cind Grüße, Ivan
quelle
unknown table status: TABLE_TYPE
Nachrichten angezeigt werden, obwohl die Abfrage ein Ergebnis lieferte. Wahrscheinlich, weil MySQL dieFROM DUAL
Klausel nicht benötigt ?quelle
Sie fügen das Ergebnis nicht ein. Sie können die Namensspalte in der Primärspalte definieren oder festlegen, dass sie eindeutig ist.
quelle
Ich hatte ein Problem und die von Mike empfohlene Methode funktionierte teilweise. Ich hatte den Fehler Dublicate Column name = '0' und änderte die Syntax Ihrer Abfrage wie folgt
Das Problem war mit Spaltennamen. sum3 war gleich sum4 und mysql warf republikanische Spaltennamen, und ich schrieb den Code in dieser Syntax und es funktionierte perfekt.
quelle
Ich hatte ein ähnliches Problem und musste mehrere einfügen, wenn es nicht vorhanden war. Aus den obigen Beispielen bin ich zu dieser Kombination gekommen ... sie ist hier, nur für den Fall, dass jemand sie brauchen würde.
Hinweis: Ich musste den Namen überall definieren, da MSSQL ihn benötigte ... MySQL funktioniert auch mit *.
MySQL: CREATE TABLE
names
(OID
int (11) NICHT NULL AUTO_INCREMENT,name
varchar (32) COLLATE utf8_unicode_ci NICHT NULL, PRIMARY KEY (OID
), EINZIGARTIGER SCHLÜSSELname_UNIQUE
(name
)) ENGINE = InnoDB AUTO_INCREMENT = 1;oder
MSSQL: CREATE TABLE [Namen] ([OID] INT IDENTITY (1, 1) NICHT NULL, [Name] NVARCHAR (32) NICHT NULL, PRIMARY KEY CLUSTERED ([OID] ASC)); CREATE UNIQUE NONCLUSTERED INDEX [Index_Names_Name] ON [names] ([name] ASC);
quelle
Diese Abfrage kann in PHP-Code verwendet werden.
Ich habe eine ID-Spalte in dieser Tabelle, daher muss ich für alle Spalten außer dieser ID-Spalte auf Duplizierung prüfen:
und jetzt wird ein neues Element nur hinzugefügt, wenn keine Zeile mit in der
SET
Zeichenfolge konfigurierten Werten vorhanden istquelle