Risposte:
La sintassi INSERT di MySQL non supporta la clausola WHERE, quindi la tua query così com'è fallirà. Supponendo che la tua id
colonna 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 id
colonna è una colonna con incremento automatico, potresti anche ometterla dal tuo INSERT insieme e lasciare che mysql la incrementi normalmente.
If you're trying to insert a new row with ID 1 you should be using
INSERT 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
Non è possibile combinare una clausola WHERE con una clausola VALUES. Hai due opzioni per quanto ne so-
INSERT che specifica i valori
INSERT INTO Users(weight, desiredWeight)
VALUES (160,145)
INSERT utilizzando un'istruzione SELECT
INSERT INTO Users(weight, desiredWeight)
SELECT weight, desiredWeight
FROM AnotherTable
WHERE id = 1
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.
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
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
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;
È 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'!='';
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?
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');
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 .
Se stai specificando un particolare record no per l'inserimento dei dati, è meglio usare l' UPDATE
istruzione anziché l' INSERT
istruzione.
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' UPDATE
istruzione per aggiornare il record esistente.Non è consigliabile usare la WHERE
clausola in caso di INSERT
.Dovresti usareUPDATE
.
Ora utilizzando la query di aggiornamento: -
UPDATE Users SET weight=160,desiredWeight=145 WHERE id=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.
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.
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.
Penso che la tua migliore opzione sia usare REPLACE invece di INSERT
REPLACE INTO Users (id, weight, wantedWeight) VALUES (1, 160, 145);
Non ha senso ... nemmeno letteralmente
INSERT
significa aggiungere un new row
e quando dici WHERE
di 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 UPDATE
invece diINSERT
B. Usa INSERT
e rimuovi la WHERE
clausola (lo sto solo dicendo ...) o se sei veramente obbligato all'uso INSERT
e WHERE
in 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.
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
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]')";
Non penso che possiamo usare la clausola where nell'istruzione insert
INSERT INTO Users(weight, desiredWeight )
SELECT '$userWeight', '$userDesiredWeight'
FROM (select 1 a ) dummy
WHERE '$userWeight' != '' AND '$userDesiredWeight'!='';
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
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.