453 Stimmen

MySQL: Datensatz einfügen, wenn nicht in Tabelle vorhanden

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 führt jedoch zu einem Fehler. 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 prüfen, ob der neue Name eindeutig ist?

594voto

Mike Punkte 20677

Ich schlage nicht wirklich vor, dass Sie das tun, denn die UNIQUE Index wie vorgeschlagen von Piskvor und andere ist eine weitaus bessere Methode, aber Sie können das, was Sie vorhatten, tatsächlich tun:

CREATE TABLE `table_listnames` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(255) NOT NULL,
  `address` varchar(255) NOT NULL,
  `tele` varchar(255) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB;

Einen Datensatz einfügen:

INSERT INTO table_listnames (name, address, tele)
SELECT * FROM (SELECT 'Rupert', 'Somewhere', '022') AS tmp
WHERE NOT EXISTS (
    SELECT name FROM table_listnames WHERE name = 'Rupert'
) LIMIT 1;

Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

SELECT * FROM `table_listnames`;

+----+--------+-----------+------+
| id | name   | address   | tele |
+----+--------+-----------+------+
|  1 | Rupert | Somewhere | 022  |
+----+--------+-----------+------+

Versuchen Sie, denselben Datensatz erneut einzufügen:

INSERT INTO table_listnames (name, address, tele)
SELECT * FROM (SELECT 'Rupert', 'Somewhere', '022') AS tmp
WHERE NOT EXISTS (
    SELECT name FROM table_listnames WHERE name = 'Rupert'
) LIMIT 1;

Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

+----+--------+-----------+------+
| id | name   | address   | tele |
+----+--------+-----------+------+
|  1 | Rupert | Somewhere | 022  |
+----+--------+-----------+------+

Einen anderen Datensatz einfügen:

INSERT INTO table_listnames (name, address, tele)
SELECT * FROM (SELECT 'John', 'Doe', '022') AS tmp
WHERE NOT EXISTS (
    SELECT name FROM table_listnames WHERE name = 'John'
) LIMIT 1;

Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

SELECT * FROM `table_listnames`;

+----+--------+-----------+------+
| id | name   | address   | tele |
+----+--------+-----------+------+
|  1 | Rupert | Somewhere | 022  |
|  2 | John   | Doe       | 022  |
+----+--------+-----------+------+

Und so weiter...


Aktualisierung:

Zu verhindern #1060 - Duplicate column name Fehler, wenn zwei Werte gleich sein können, müssen Sie die Spalten des inneren SELECT benennen:

INSERT INTO table_listnames (name, address, tele)
SELECT * FROM (SELECT 'Unknown' AS name, 'Unknown' AS address, '022' AS tele) AS tmp
WHERE NOT EXISTS (
    SELECT name FROM table_listnames WHERE name = 'Rupert'
) LIMIT 1;

Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

SELECT * FROM `table_listnames`;

+----+---------+-----------+------+
| id | name    | address   | tele |
+----+---------+-----------+------+
|  1 | Rupert  | Somewhere | 022  |
|  2 | John    | Doe       | 022  |
|  3 | Unknown | Unknown   | 022  |
+----+---------+-----------+------+

312voto

INSERT erlaubt nicht WHERE in der Syntax .

Was Sie tun können: Erstellen Sie eine UNIQUE INDEX für das Feld, das eindeutig sein sollte ( name ), dann verwenden Sie entweder:

  • normal INSERT (und behandeln den Fehler, wenn der Name bereits existiert)
  • INSERT IGNORE (die stillschweigend versagen eine Warnung auslösen (statt eines Fehlers), wenn der Name bereits existiert)
  • INSERT ... ON DUPLICATE KEY UPDATE (der die UPDATE am Ende, wenn Name bereits existiert, siehe Dokumentation )

75voto

Mahbub Tito Punkte 971

Arbeitete:

INSERT INTO users (full_name, login, password) 
  SELECT 'Mahbub Tito','tito',SHA1('12345') FROM DUAL
WHERE NOT EXISTS 
  (SELECT login FROM users WHERE login='tito');

34voto

sdesvergez Punkte 775

MySQL bietet eine sehr hübsche Lösung:

REPLACE INTO `table` VALUES (5, 'John', 'Doe', SHA1('password'));

Sehr einfach zu verwenden, da Sie einen eindeutigen Primärschlüssel deklariert haben (hier mit dem Wert 5).

28voto

Montaser El-sawy Punkte 740
INSERT IGNORE INTO `mytable`
SET `field0` = '2',
`field1` = 12345,
`field2` = 12678;

Hier die Mysql-Abfrage, die Datensätze einfügt, wenn sie nicht vorhanden sind, und die vorhandenen ähnlichen Datensätze ignoriert.

----Untested----

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X