MySQL Insert Where-Abfrage

121

Was ist los mit dieser Abfrage:

INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;

Es funktioniert ohne die WHEREKlausel. Ich habe anscheinend mein SQL vergessen.

Taryn
quelle

Antworten:

237

Die MySQL INSERT-Syntax unterstützt die WHERE-Klausel nicht, sodass Ihre aktuelle Abfrage fehlschlägt. Angenommen, Ihre idSpalte ist eindeutig oder Primärschlüssel:

Wenn Sie versuchen, eine neue Zeile mit der ID 1 einzufügen, sollten Sie Folgendes verwenden:

INSERT INTO Users(id, weight, desiredWeight) VALUES(1, 160, 145);

Wenn Sie versuchen, die Werte für Gewicht / gewünschtes Gewicht für eine vorhandene Zeile mit der ID 1 zu ändern, sollten Sie Folgendes verwenden:

UPDATE Users SET weight = 160, desiredWeight = 145 WHERE id = 1;

Wenn Sie möchten, können Sie auch die Syntax INSERT .. ON DUPLICATE KEY wie folgt verwenden:

INSERT INTO Users (id, weight, desiredWeight) VALUES(1, 160, 145) ON DUPLICATE KEY UPDATE weight=160, desiredWeight=145

ODER auch so:

INSERT INTO Users SET id=1, weight=160, desiredWeight=145 ON DUPLICATE KEY UPDATE weight=160, desiredWeight=145

Es ist auch wichtig zu beachten, dass wenn Ihre idSpalte eine Autoincrement-Spalte ist, Sie sie genauso gut in Ihrem INSERT weglassen können und MySQL sie wie gewohnt inkrementieren lassen können.

Chad Birch
quelle
1
Danke für eine gute Antwort. Bei Verwendung der UPDATE-Abfrage funktioniert dies einwandfrei. Wenn id jedoch ein Primärschlüssel und ein Auto-Inkrement-Schlüssel ist, funktioniert die obige INSERT-Anweisung nicht. Fehler Duplizieren Sie den Eintrag '1' für Schlüssel 1.
JDGuide
1
@JDeveloper Das liegt daran, dass die Zeile bereits vorhanden ist. Wie Chad erwähnte If you're trying to insert a new row with ID 1 you should be usingINSERT INTO. In Ihrem Fall versuchen Sie einzufügen, wenn ID 1 bereits vorhanden ist und es sich um einen Primär- oder eindeutigen Schlüssel handelt und fehlschlägt. Verwenden Sie daher entweder die UPDATE-Syntax oder INSERT. ON DUPLICATE KEY-Syntax
Anthony Hatzopoulos
41

Sie können eine WHERE-Klausel nicht mit einer VALUES-Klausel kombinieren. Soweit mir bekannt ist, haben Sie zwei Möglichkeiten:

  1. INSERT, das Werte angibt

    INSERT INTO Users(weight, desiredWeight) 
    VALUES (160,145)
  2. INSERT mit einer SELECT-Anweisung

    INSERT INTO Users(weight, desiredWeight) 
    SELECT weight, desiredWeight 
    FROM AnotherTable 
    WHERE id = 1
Russ Cam
quelle
19

Sie verwenden die WHERE-Klausel für UPDATE-Abfragen. Wenn Sie EINFÜGEN, gehen Sie davon aus, dass die Zeile nicht vorhanden ist.

Die Erklärung des OP würde dann werden;

UPDATE Benutzer SET Gewicht = 160, gewünschtes Gewicht = 45 wobei id = 1;

Wenn Sie in MySQL INSERT oder UPDATE möchten, können Sie die REPLACE-Abfrage mit einer WHERE-Klausel verwenden. Wenn das WHERE nicht existiert, wird es eingefügt, andernfalls wird es aktualisiert.

BEARBEITEN

Ich denke, dass Bill Karwins Argument wichtig genug ist, um aus den Kommentaren herauszukommen und es sehr offensichtlich zu machen. Danke Bill, es ist zu lange her, seit ich mit MySQL gearbeitet habe. Ich erinnerte mich, dass ich Probleme mit REPLACE hatte, aber ich vergaß, was sie waren. Ich hätte es nachschlagen sollen.

So funktioniert REPLACE von MySQL nicht. Es wird ein DELETE ausgeführt (was ein No-Op sein kann, wenn die Zeile nicht vorhanden ist), gefolgt von einem INSERT. Denken Sie an die Konsequenzen vis. Trigger und Fremdschlüsselabhängigkeiten. Verwenden Sie stattdessen INSERT ... ON DUPLICATE KEY UPDATE.

Rob Prouse
quelle
7
So funktioniert REPLACE von MySQL nicht. Es wird ein DELETE ausgeführt (was ein No-Op sein kann, wenn die Zeile nicht vorhanden ist), gefolgt von einem INSERT. Denken Sie an die Konsequenzen vis. Trigger und Fremdschlüsselabhängigkeiten. Verwenden Sie stattdessen INSERT ... ON DUPLICATE KEY UPDATE.
Bill Karwin
10

Ich glaube nicht, dass die Einfügung eine WHERE-Klausel enthält.

Daniel A. White
quelle
Das ist wahr und Sand gleichzeitig!
Ingus
5

Abfrage einfügen unterstützt nicht, wo Schlüsselwort *

Bedingungen gelten, weil Sie where-Bedingung für Unterauswahlanweisungen verwenden können. Sie können komplizierte Einfügungen mit Unterauswahl durchführen.

Beispielsweise:

INSERT INTO suppliers
(supplier_id, supplier_name)
SELECT account_no, name
FROM customers
WHERE city = 'Newark';

Durch Platzieren eines "select" in der insert-Anweisung können Sie schnell mehrere Einfügungen durchführen.

Bei dieser Art der Einfügung möchten Sie möglicherweise die Anzahl der eingefügten Zeilen überprüfen. Sie können die Anzahl der Zeilen bestimmen, die eingefügt werden sollen, indem Sie die folgende SQL-Anweisung ausführen, bevor Sie die Einfügung ausführen.

SELECT count(*)
FROM customers
WHERE city = 'Newark';

Sie können sicherstellen, dass Sie keine doppelten Informationen einfügen, indem Sie die EXISTS-Bedingung verwenden.

Wenn Sie beispielsweise eine Tabelle mit dem Namen clients mit dem Primärschlüssel client_id hatten, können Sie die folgende Anweisung verwenden:

INSERT INTO clients
(client_id, client_name, client_type)
SELECT supplier_id, supplier_name, 'advertising'
FROM suppliers
WHERE not exists (select * from clients
where clients.client_id = suppliers.supplier_id);

Diese Anweisung fügt mehrere Datensätze mit einer Unterauswahl ein.

Wenn Sie einen einzelnen Datensatz einfügen möchten, können Sie die folgende Anweisung verwenden:

INSERT INTO clients
(client_id, client_name, client_type)
SELECT 10345, 'IBM', 'advertising'
FROM dual
WHERE not exists (select * from clients
where clients.client_id = 10345);

Durch die Verwendung der dualen Tabelle können Sie Ihre Werte in eine select-Anweisung eingeben, obwohl die Werte derzeit nicht in einer Tabelle gespeichert sind.

Siehe auch Einfügen mit der where-Klausel

Somnath Muluk
quelle
4

Die richtige Antwort auf diese Frage lautet wie folgt:

ein). WENN Sie vor dem Einfügen auswählen möchten:

INSERT INTO Users( weight, desiredWeight ) 
  select val1 , val2  from tableXShoulatNotBeUsers
  WHERE somecondition;

b). Wenn der Datensatz bereits vorhanden ist, verwenden Sie update anstelle von insert:

 INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;

Sollte sein

Update Users set weight=160, desiredWeight=145  WHERE id = 1;

c). Wenn Sie gleichzeitig aktualisieren oder einfügen möchten

Replace Users set weight=160, desiredWeight=145  WHERE id = 1;

Note):- you should provide values to all fields else missed field in query 
        will be set to null

d). Wenn Sie einen Datensatz aus der gleichen Tabelle klonen möchten, denken Sie daran, dass Sie nicht aus der Tabelle auswählen können, in die Sie daher einfügen

 create temporary table xtable ( weight int(11), desiredWeight int(11) ;

 insert into xtable (weight, desiredWeight) 
    select weight, desiredWeight from Users where [condition]

 insert into Users (weight, desiredWeight) 
    select weight , desiredWeight from xtable;

Ich denke, das deckt die meisten Szenarien ziemlich ab

sakhunzai
quelle
3

Sie können WHERE einfach nicht verwenden, wenn Sie eine INSERT-Anweisung ausführen:

 INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;

sollte sein:

 INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 );

Der WHERE-Teil funktioniert nur in SELECT-Anweisungen:

SELECT from Users WHERE id = 1;

oder in UPDATE-Anweisungen:

UPDATE Users set (weight = 160, desiredWeight = 145) WHERE id = 1;
Borniet
quelle
2

Einfügen in = Hinzufügen von Zeilen zu einer Tabelle

Upate = Aktualisiere bestimmte Zeilen.

Was würde die where-Klausel in Ihrer Beilage beschreiben? Es hat nichts zu passen, die Zeile existiert (noch) nicht ...

Richard L.
quelle
2

Sie können bedingte EINFÜGUNGEN basierend auf Benutzereingaben ausführen. Diese Abfrage wird nur eingefügt, wenn die Eingabevariablen '$ userWeight' und '$ userDesiredWeight' nicht leer sind

INSERT INTO Users(weight, desiredWeight )
select '$userWeight', '$userDesiredWeight'  
FROM (select 1 a ) dummy
WHERE '$userWeight' != '' AND '$userDesiredWeight'!='';
Igor Vujovic
quelle
1

Dies hängt von der Situation ab, in der INSERT tatsächlich eine where-Klausel haben kann.

Zum Beispiel, wenn Sie Werte aus einem Formular abgleichen.

Consider INSERT INTO Users(name,email,weight, desiredWeight) VALUES (fred,bb@yy.com,160,145) WHERE name != fred AND email != bb@yy.com

Macht Sinn, nicht wahr?

Frank Nwoko
quelle
ist es möglich, wo Klausel in
Einfügeanweisung
1

Am einfachsten ist es, IF zu verwenden, um eine Schlüsseleinschränkung zu verletzen. Dies funktioniert nur für INSERT IGNORE, ermöglicht Ihnen jedoch die Verwendung von Einschränkungen in einem INSERT.

INSERT INTO Test (id, name) VALUES (IF(1!=0,NULL,1),'Test');
Ethan Brooks
quelle
1

Nach der WHEREKlausel setzen Sie eine Bedingung, die entweder zum Abrufen von Daten oder zum Aktualisieren einer Zeile verwendet wird. Beim Einfügen von Daten wird davon ausgegangen, dass die Zeile nicht vorhanden ist.

Die Frage ist also, gibt es eine Zeile mit der ID 1? Wenn ja, verwenden Sie MySQL UPDATE , andernfalls MySQL INSERT .

Revathi
quelle
1

Wenn Sie eine bestimmte Datensatznummer für das Einfügen von Daten angeben, ist es besser, die UPDATEAnweisung anstelle der INSERTAnweisung zu verwenden.

Diese Art von Abfrage, die Sie in die Frage geschrieben haben, ähnelt einer Dummy-Abfrage.

Ihre Anfrage lautet: -

INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;

Hier geben Sie die ID = 1 an. Verwenden Sie daher besser die UPDATEAnweisung, um den vorhandenen Datensatz zu aktualisieren. Es wird nicht empfohlen, die WHEREKlausel zu verwenden , wenn INSERT.You verwenden sollte UPDATE.

Jetzt Update-Abfrage verwenden: -

UPDATE Users SET weight=160,desiredWeight=145 WHERE id=1;
JDGuide
quelle
Keine mate.1st-Abfrage funktioniert nicht.1st-Abfrage ist die gestellte Frage.
JDGuide
Warum schlagen Sie ein Update über das Einfügen vor? Der Benutzer möchte Werte mit Bedingung einfügen und vorhandene Datensätze nicht aktualisieren.
Somnath Muluk
1

Kann die WHERE-Klausel in jedem Fall tatsächlich mit INSERT-INTO-VALUES verwendet werden?

Die Antwort ist definitiv nein.

Das Hinzufügen einer WHERE-Klausel nach INSERT INTO ... VALUES ... ist nur ungültiges SQL und wird nicht analysiert.

Der von MySQL zurückgegebene Fehler lautet:

mysql> INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE id = 1' at line 1

Der wichtigste Teil der Fehlermeldung ist

... syntax to use near 'WHERE id = 1' ...

Dies zeigt den spezifischen Teil, den der Parser hier nicht erwartet hatte: die WHERE-Klausel.

Marc Alff
quelle
1

Es ist völlig falsch. INSERT QUERY hat keine WHERE-Klausel, nur UPDATE QUERY. Wenn Sie Daten hinzufügen möchten, bei denen id = 1 ist, lautet Ihre Abfrage

UPDATE Users SET weight=160, desiredWeight= 145 WHERE id = 1;
Asmarah
quelle
1

Soweit mir bekannt ist, können Sie die WHERE-Klausel nicht in diese Abfrage einfügen. Vielleicht habe ich auch mein SQL vergessen, weil ich nicht sicher bin, warum Sie es sowieso brauchen.

Ikechi Anyanwu
quelle
1

Sie sollten die where-Bedingung in der Insert-Anweisung nicht verwenden. Wenn Sie dies möchten, verwenden Sie Einfügen in eine Aktualisierungsanweisung und aktualisieren Sie dann einen vorhandenen Datensatz.

Kann ich eigentlich wissen, warum Sie eine where-Klausel in der Insert-Anweisung benötigen?

Vielleicht aus dem Grund, warum ich Ihnen eine bessere Option vorschlagen könnte.

Krishna Thota
quelle
1

Ich denke, Ihre beste Option ist REPLACE anstelle von INSERT

IN Benutzer ERSETZEN (ID, Gewicht, gewünschtes Gewicht) WERTE (1, 160, 145);

Alberto León
quelle
1

LESEN SIE DAS AUCH

Es macht keinen Sinn ... auch nicht wörtlich

INSERTbedeutet, fügen Sie ein new rowund wenn Sie sagen, WHERESie definieren, über welche Zeile Sie in der sprechen SQL.

Das Hinzufügen einer neuen Zeile ist daher mit einer Bedingung für eine vorhandene Zeile nicht möglich.

Sie müssen aus folgenden Optionen auswählen:

A. Verwenden Sie UPDATEanstelle vonINSERT

B. Verwenden INSERTund entfernen Sie die WHEREKlausel (ich sage es nur ...) oder wenn Sie wirklich verpflichtet sind, sie zu verwenden, INSERTund WHEREin einer einzigen Anweisung kann dies nur über die INSERT..SELECT-Klausel erfolgen ...

INSERT INTO Users( weight, desiredWeight ) 
SELECT FROM Users WHERE id = 1;

Dies dient jedoch einem ganz anderen Zweck. Wenn Sie die ID als Primärschlüssel definiert haben, schlägt diese Einfügung fehl, andernfalls wird eine neue Zeile mit der ID = 1 eingefügt.

Bharat Sinha
quelle
Ja, Sie haben Recht, wenn Sie wissen, dass all diese Dinge Fehler machen.
Asesha George
1

Ich bin mir bewusst, dass dies ein alter Beitrag ist, aber ich hoffe, dass dies noch jemandem helfen wird. Ich hoffe, dass dies ein einfaches Beispiel ist:

Hintergrund:

Ich hatte viele bis viele Fälle: Derselbe Benutzer wird mehrmals mit mehreren Werten aufgelistet und ich wollte einen neuen Datensatz erstellen. Daher wäre UPDATE in meinem Fall nicht sinnvoll und ich musste einen bestimmten Benutzer genau wie ich ansprechen mit einer WHERE-Klausel.

INSERT into MyTable(aUser,aCar)
value(User123,Mini)

Mit diesem Konstrukt zielen Sie tatsächlich auf einen bestimmten Benutzer ab (Benutzer123, der über andere Datensätze verfügt), sodass Sie meiner Meinung nach keine where-Klausel benötigen.

Die Ausgabe könnte sein:

aUser   aCar
user123 mini
user123 HisOtherCarThatWasThereBefore
Ylenia88m
quelle
1

Eine Möglichkeit, INSERT und WHERE zu verwenden, ist

INSERT INTO MYTABLE SELECT 953,'Hello',43 WHERE 0 in (SELECT count(*) FROM MYTABLE WHERE myID=953); In diesem Fall ist es wie ein Existenztest. Es gibt keine Ausnahme, wenn Sie es zwei oder mehr Mal ausführen ...

rauben
quelle
0

Die korrekte Syntax für das Einfügen von MySQL in eine Anweisung mithilfe der Post-Methode lautet:

$sql="insert into ttable(username,password) values('$_POST[username]','$_POST[password]')";
Chaitanya Koripella
quelle
1
Sie müssen nicht vertrauenswürdigen Parametern wie dem Benutzernamen entkommen oder parametrisierte Abfragen verwenden, um zu verhindern, dass ein Angreifer beliebige SQL-Befehle einfügt . Verwenden Sie einen der HashCrypt-Algorithmen, um das Kennwort zu speichern.
Hendrik Brummermann
0

Ich glaube nicht, dass wir die where-Klausel in der insert-Anweisung verwenden können

Nipun Jain
quelle
0
INSERT INTO Users(weight, desiredWeight )
SELECT '$userWeight', '$userDesiredWeight'  
FROM (select 1 a ) dummy
WHERE '$userWeight' != '' AND '$userDesiredWeight'!='';
user6297694
quelle
1
Können Sie Ihre vorgeschlagene Antwort bearbeiten, um zu erläutern, was dies bewirkt und wie es das OP anspricht?
Ro Yo Mi
0

Sie können INSERT und WHERE nicht zusammen verwenden. Sie können die UPDATE-Klausel verwenden, um einer bestimmten Spalte in einem bestimmten Feld einen Mehrwert zu verleihen, wie im folgenden Code angegeben.

UPDATE Users
SET weight='160',desiredWeight ='145'  
WHERE id =1
Vishal Vaishnav
quelle
0

Ich denke, dass das richtige Formular zum Einfügen eines Werts in eine bestimmte Zeile lautet:

UPDATE table SET column = value WHERE columnid = 1

Es funktioniert und ist ähnlich, wenn Sie auf Microsoft SQL Server schreiben

INSERT INTO table(column) VALUES (130) WHERE id = 1;

Auf MySQL müssen Sie die Tabelle aktualisieren.

Jonathan JS
quelle
0

Sie können dies mit dem folgenden Code tun:

INSERT INTO table2 (column1, column2, column3, ...)
SELECT column1, column2, column3, ...
FROM table1
WHERE condition
KimchiMan
quelle