MySQL Insert Where query


121

Cosa c'è di sbagliato in questa query:

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

Funziona senza la WHEREclausola. Mi sembrava di aver dimenticato il mio SQL ..

Risposte:


237

La sintassi INSERT di MySQL non supporta la clausola WHERE, quindi la tua query così com'è fallirà. Supponendo che la tua idcolonna sia una chiave univoca o primaria:

Se stai cercando di inserire una nuova riga con ID 1 dovresti usare:

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

Se stai tentando di modificare i valori di peso / peso desiderato per una riga esistente con ID 1, dovresti utilizzare:

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

Se vuoi puoi anche usare la sintassi INSERT .. ON DUPLICATE KEY in questo modo:

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

O anche così:

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

È anche importante notare che se la tua idcolonna è una colonna con incremento automatico, potresti anche ometterla dal tuo INSERT insieme e lasciare che mysql la incrementi normalmente.


1
Grazie per la buona risposta. Quando si utilizza la query UPDATE, funziona correttamente. Tuttavia, quando id è una chiave primaria e una chiave di incremento automatico, l'istruzione INSERT sopra non funziona Errore: Voce duplicata '1' per la chiave 1.
JDGuide

1
@JDeveloper Questo perché la riga esiste già. Come ha detto Chad If you're trying to insert a new row with ID 1 you should be usingINSERT INTO. Nel tuo caso stai tentando di inserire quando l'ID 1 esiste già ed è una chiave primaria o univoca e non riesce quindi dovresti usare la sintassi UPDATE o INSERT .. ON DUPLICATE KEY syntax
Anthony Hatzopoulos

41

Non è possibile combinare una clausola WHERE con una clausola VALUES. Hai due opzioni per quanto ne so-

  1. INSERT che specifica i valori

    INSERT INTO Users(weight, desiredWeight) 
    VALUES (160,145)
  2. INSERT utilizzando un'istruzione SELECT

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

19

Si utilizza la clausola WHERE per le query UPDATE. Quando si INSERT, si presume che la riga non esista.

La dichiarazione del PO diventerebbe allora;

UPDATE Users SET peso = 160, peso desiderato = 45 dove id = 1;

In MySQL, se vuoi INSERT o UPDATE, puoi usare la query REPLACE con una clausola WHERE. Se il WHERE non esiste, INSERISCE, altrimenti si AGGIORNA.

MODIFICARE

Penso che il punto di Bill Karwin sia abbastanza importante da tirare fuori i commenti e renderlo molto ovvio. Grazie Bill, è passato troppo tempo da quando ho lavorato con MySQL, mi sono ricordato di avere problemi con REPLACE, ma ho dimenticato cosa fossero. Avrei dovuto cercarlo.

Non è così che funziona REPLACE di MySQL. Esegue un DELETE (che può essere un no-op se la riga non esiste), seguito da un INSERT. Pensa alle conseguenze vis. trigger e dipendenze da chiavi esterne. Utilizzare invece INSERT ... ON DUPLICATE KEY UPDATE.


7
Non è così che funziona REPLACE di MySQL. Esegue un DELETE (che può essere un no-op se la riga non esiste), seguito da un INSERT. Pensa alle conseguenze vis. trigger e dipendenze da chiavi esterne. Utilizzare invece INSERT ... ON DUPLICATE KEY UPDATE.
Bill Karwin,


5

Inserisci query non supporta la parola chiave where *

Si applicano condizioni perché è possibile utilizzare la condizione where per le istruzioni di selezione secondaria. È possibile eseguire inserimenti complicati utilizzando le selezioni secondarie.

Per esempio:

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

Inserendo una "selezione" nell'istruzione di inserimento, è possibile eseguire rapidamente inserimenti multipli.

Con questo tipo di inserto, potresti voler controllare il numero di righe da inserire. È possibile determinare il numero di righe che verranno inserite eseguendo la seguente istruzione SQL prima di eseguire l'inserimento.

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

Puoi assicurarti di non inserire informazioni duplicate utilizzando la condizione EXISTS.

Ad esempio, se avessi una tabella denominata client con una chiave primaria di client_id, potresti utilizzare la seguente istruzione:

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

Questa istruzione inserisce più record con una sottoselezione.

Se si desidera inserire un singolo record, è possibile utilizzare la seguente dichiarazione:

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

L'uso della doppia tabella consente di inserire i propri valori in un'istruzione select, anche se i valori non sono attualmente memorizzati in una tabella.

Vedi anche Come inserire con la clausola where


4

La risposta giusta a questa domanda sarà qc come questa:

un). SE si desidera selezionare prima di inserire:

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

b). SE il record esiste già, usa l'aggiornamento invece di inserire:

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

Dovrebbe essere

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

c). Se vuoi aggiornare o inserire allo stesso tempo

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). Se vuoi CLONE un record dalla STESSA tabella, ricorda che non puoi selezionare dalla tabella in cui stai inserendo quindi

 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;

Penso che questo copra abbastanza la maggior parte degli scenari


3

Semplicemente non puoi usare WHERE quando esegui un'istruzione INSERT:

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

dovrebbe essere:

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

La parte WHERE funziona solo nelle istruzioni SELECT:

SELECT from Users WHERE id = 1;

o nelle istruzioni UPDATE:

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

2

Inserisci in = Aggiunta di righe a una tabella

Upate = aggiorna righe specifiche.

Cosa descriverebbe la clausola where nel tuo inserto? Non ha nulla da abbinare, la riga non esiste (ancora) ...


2

È possibile eseguire INSERT condizionale in base all'input dell'utente. Questa query verrà inserita solo se le variabili di input '$ userWeight' e '$ userDesiredWeight' non sono vuote

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

1

Dipende dalla situazione INSERT può effettivamente avere una clausola where.

Ad esempio, se stai confrontando i valori da un modulo.

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

Ha senso non è vero?


è possibile la clausola
where nell'istruzione

1

Il modo più semplice è usare IF per violare il vincolo di una chiave. Funziona solo per INSERT IGNORE ma ti consentirà di utilizzare il vincolo in un INSERT.

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

1

Dopo WHERE clausola si inserisce una condizione, che viene utilizzata per il recupero dei dati o per l'aggiornamento di una riga. Quando si inseriscono dati, si presume che la riga non esista.

Quindi, la domanda è: c'è qualche riga il cui ID è 1? se è così, usa MySQL UPDATE , altrimenti usa MySQL INSERT .


1

Se stai specificando un particolare record no per l'inserimento dei dati, è meglio usare l' UPDATEistruzione anziché l' INSERTistruzione.

Questo tipo di query che hai scritto nella domanda è come una query fittizia.

La tua domanda è: -

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

Qui, stai specificando l'id = 1, quindi è meglio usare l' UPDATEistruzione per aggiornare il record esistente.Non è consigliabile usare la WHEREclausola in caso di INSERT.Dovresti usareUPDATE .

Ora utilizzando la query di aggiornamento: -

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

No mate.1st query non funzionerà. 1st query è la domanda posta.
JDGuide

Perché suggerisci l'aggiornamento rispetto all'inserimento? L'utente desidera inserire valori con condizione e non aggiornare i record in uscita.
Somnath Muluk

1

La clausola WHERE può essere effettivamente utilizzata con INSERT-INTO-VALUES in ogni caso?

La risposta è definitivamente no.

L'aggiunta di una clausola WHERE dopo INSERT INTO ... VALUES ... è solo un SQL non valido e non verrà analizzato.

L'errore restituito da MySQL è:

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

La parte più importante del messaggio di errore è

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

che mostra la parte specifica che il parser non si aspettava di trovare qui: la clausola WHERE.


1

è totalmente sbagliato. INSERT QUERY non ha una clausola WHERE, ce l'ha solo UPDATE QUERY. Se desideri aggiungere dati dove id = 1, la tua query sarà

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

1

No. Per quanto ne so, non puoi aggiungere la clausola WHERE a questa query. Forse ho dimenticato anche il mio SQL, perché comunque non sono sicuro del motivo per cui ne hai bisogno.


1

Non utilizzare la condizione where nell'istruzione Insert. Se lo desideri, utilizza l'inserimento in un'istruzione di aggiornamento e quindi aggiorna un record esistente.

In realtà posso sapere perché hai bisogno di una clausola dove nell'istruzione Insert ??

Forse in base al motivo per cui potrei suggerirti un'opzione migliore.


1

Penso che la tua migliore opzione sia usare REPLACE invece di INSERT

REPLACE INTO Users (id, weight, wantedWeight) VALUES (1, 160, 145);


1

LEGGI ANCHE QUESTO

Non ha senso ... nemmeno letteralmente

INSERTsignifica aggiungere un new rowe quando dici WHEREdi definire di quale riga stai parlando nel file SQL.

Quindi l'aggiunta di una nuova riga non è possibile con una condizione su una riga esistente.

Devi scegliere tra i seguenti:

A. Usa UPDATEinvece diINSERT

B. Usa INSERTe rimuovi la WHEREclausola (lo sto solo dicendo ...) o se sei veramente obbligato all'uso INSERTe WHEREin una singola istruzione può essere fatto solo tramite la clausola INSERT..SELECT ...

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

Ma questo ha uno scopo completamente diverso e se hai definito id come chiave primaria questo inserimento fallirà, altrimenti verrà inserita una nuova riga con id = 1.


sì, hai ragione, sapere che tutte queste cose si svegliano commettono errori.
Asesha George

1

Sono consapevole che questo è un vecchio post ma spero che questo possa ancora aiutare qualcuno, con quello che spero sia un semplice esempio:

sfondo:

Ho avuto un caso molti a molti: lo stesso utente è elencato più volte con più valori e volevo creare un nuovo record, quindi UPDATE non avrebbe avuto senso nel mio caso e avevo bisogno di rivolgermi a un particolare utente proprio come farei utilizzando una clausola WHERE.

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

Usando questo costrutto in realtà miri a un utente specifico (user123, che ha altri record) quindi non hai davvero bisogno di una clausola where, credo.

l'output potrebbe essere:

aUser   aCar
user123 mini
user123 HisOtherCarThatWasThereBefore

1

Un modo per usare INSERT e WHERE è

INSERT INTO MYTABLE SELECT 953,'Hello',43 WHERE 0 in (SELECT count(*) FROM MYTABLE WHERE myID=953); In questo caso è come un test di esistenza. Non ci sono eccezioni se lo esegui due o più volte ...


0

la sintassi corretta per l'inserimento di mysql nell'istruzione utilizzando il metodo post è:

$sql="insert into ttable(username,password) values('$_POST[username]','$_POST[password]')";

1
È necessario eseguire l'escape di parametri non attendibili come il nome utente o utilizzare query con parametri per impedire a un utente malintenzionato di iniettare comandi SQL arbitrari . E utilizza uno degli algoritmi HashCrypt per memorizzare la password.
Hendrik Brummermann

0

Non penso che possiamo usare la clausola where nell'istruzione insert


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

1
Puoi modificare la tua risposta proposta per espandere su cosa fa e come affronta l'OP?
Ro Yo Mi

0

Non puoi usare INSERT e WHERE insieme. È possibile utilizzare la clausola UPDATE per aggiungere valore a una particolare colonna in un campo particolare come il codice sottostante;

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

0

Penso che la forma corretta per inserire un valore su una riga specifica sia:

UPDATE table SET column = value WHERE columnid = 1

funziona ed è simile se scrivi su Microsoft SQL Server

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

su mysql devi aggiornare la tabella.


0

Puoi farlo con il codice seguente:

INSERT INTO table2 (column1, column2, column3, ...)
SELECT column1, column2, column3, ...
FROM table1
WHERE condition
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.