Respuestas:
MySQL INSERT Syntax no es compatible con la cláusula WHERE, por lo que su consulta tal como está, fallará. Asumiendo que su id
columna es clave única o primaria:
Si está intentando insertar una nueva fila con ID 1, debería estar usando:
INSERT INTO Users(id, weight, desiredWeight) VALUES(1, 160, 145);
Si está intentando cambiar los valores de peso / peso deseado para una fila existente con ID 1, debería usar:
UPDATE Users SET weight = 160, desiredWeight = 145 WHERE id = 1;
Si lo desea, también puede usar INSERT .. ON DUPLICATE KEY sintaxis de esta manera:
INSERT INTO Users (id, weight, desiredWeight) VALUES(1, 160, 145) ON DUPLICATE KEY UPDATE weight=160, desiredWeight=145
O incluso así:
INSERT INTO Users SET id=1, weight=160, desiredWeight=145 ON DUPLICATE KEY UPDATE weight=160, desiredWeight=145
También es importante tener en cuenta que si su id
columna es una columna de autoincremento, también podría omitirla de su INSERTAR y dejar que mysql la incremente de manera normal.
If you're trying to insert a new row with ID 1 you should be using
INSERTAR EN. En su caso, está intentando insertar cuando la ID 1 ya existe y es una clave primaria o única y falla, por lo que debe usar la sintaxis ACTUALIZAR o INSERTAR ...
No puede combinar una cláusula WHERE con una cláusula VALUES. Tienes dos opciones, que yo sepa,
INSERTAR especificando valores
INSERT INTO Users(weight, desiredWeight)
VALUES (160,145)
INSERTAR usando una instrucción SELECT
INSERT INTO Users(weight, desiredWeight)
SELECT weight, desiredWeight
FROM AnotherTable
WHERE id = 1
Utiliza la cláusula WHERE para consultas de ACTUALIZACIÓN. Cuando INSERTAS, estás asumiendo que la fila no existe.
La declaración del OP se convertiría en;
ACTUALIZACIÓN Usuarios SET peso = 160, deseado Peso = 45 donde id = 1;
En MySQL, si desea INSERTAR o ACTUALIZAR, puede usar la consulta REPLACE con una cláusula WHERE. Si el DONDE no existe, INSERTA; de lo contrario, ACTUALIZA.
EDITAR
Creo que el punto de Bill Karwin es lo suficientemente importante como para salir de los comentarios y hacerlo muy obvio. Gracias Bill, ha pasado mucho tiempo desde que trabajé con MySQL, recordé que tenía problemas con REPLACE, pero olvidé cuáles eran. Debería haberlo buscado.
Así no es como funciona el REEMPLAZO de MySQL. Hace un DELETE (que puede ser un no-op si la fila no existe), seguido de un INSERT. Piensa en las consecuencias vis. disparadores y dependencias de clave externa. En su lugar, use INSERTAR ... EN ACTUALIZACIÓN CLAVE DUPLICADA.
Las condiciones se aplican porque puede usar la condición where para las declaraciones de subselección. Puede realizar inserciones complicadas utilizando sub-selecciones.
Por ejemplo:
INSERT INTO suppliers
(supplier_id, supplier_name)
SELECT account_no, name
FROM customers
WHERE city = 'Newark';
Al colocar una "selección" en la instrucción de inserción, puede realizar múltiples inserciones rápidamente.
Con este tipo de inserción, es posible que desee verificar el número de filas que se están insertando. Puede determinar el número de filas que se insertarán ejecutando la siguiente instrucción SQL antes de realizar la inserción.
SELECT count(*)
FROM customers
WHERE city = 'Newark';
Puede asegurarse de no insertar información duplicada utilizando la condición EXISTS.
Por ejemplo, si tuviera una tabla llamada clientes con una clave primaria de client_id, podría usar la siguiente instrucción:
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);
Esta declaración inserta múltiples registros con una subselección.
Si desea insertar un solo registro, puede usar la siguiente instrucción:
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);
El uso de la tabla dual le permite ingresar sus valores en una declaración de selección, aunque los valores no estén actualmente almacenados en una tabla.
Consulte también Cómo insertar con la cláusula where
La respuesta correcta a esta pregunta será algo así:
una). SI desea seleccionar antes de insertar:
INSERT INTO Users( weight, desiredWeight )
select val1 , val2 from tableXShoulatNotBeUsers
WHERE somecondition;
si). Si ya existe el registro, use la actualización en lugar de insertar:
INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;
Debiera ser
Update Users set weight=160, desiredWeight=145 WHERE id = 1;
C). Si desea actualizar o insertar al mismo tiempo
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
re). Si desea CLONAR un registro de la MISMA tabla, solo recuerde que no puede seleccionar de la tabla en la que está insertando
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;
Creo que esto cubre la mayoría de los escenarios.
Simplemente no puede usar WHERE al hacer una instrucción INSERT:
INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;
debiera ser:
INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 );
La parte WHERE solo funciona en las instrucciones SELECT:
SELECT from Users WHERE id = 1;
o en las declaraciones de ACTUALIZACIÓN:
UPDATE Users set (weight = 160, desiredWeight = 145) WHERE id = 1;
Puede hacer INSERT condicional según la entrada del usuario. Esta consulta solo se insertará si la entrada vars '$ userWeight' y '$ userDesiredWeight' no están en blanco
INSERT INTO Users(weight, desiredWeight )
select '$userWeight', '$userDesiredWeight'
FROM (select 1 a ) dummy
WHERE '$userWeight' != '' AND '$userDesiredWeight'!='';
Depende de la situación INSERT puede tener una cláusula where.
Por ejemplo, si está haciendo coincidir valores de un formulario.
Consider INSERT INTO Users(name,email,weight, desiredWeight) VALUES (fred,bb@yy.com,160,145) WHERE name != fred AND email != bb@yy.com
Tiene sentido, ¿no?
La forma más simple es usar IF para violar una restricción clave. Esto solo funciona para INSERT IGNORE pero le permitirá usar restricciones en un INSERT.
INSERT INTO Test (id, name) VALUES (IF(1!=0,NULL,1),'Test');
Después de la WHERE
cláusula, se establece una condición y se utiliza para buscar datos o para actualizar una fila. Cuando inserta datos, se supone que la fila no existe.
Entonces, la pregunta es, ¿hay alguna fila cuya identificación sea 1? si es así, use ACTUALIZACIÓN MySQL , de lo contrario use INSERT MySQL .
Si está especificando un registro particular no para insertar datos, es mejor usar una UPDATE
declaración en lugar de una INSERT
declaración.
Este tipo de consulta que ha escrito en la pregunta es como una consulta ficticia.
Su consulta es: -
INSERT INTO Users( weight, desiredWeight ) VALUES ( 160, 145 ) WHERE id = 1;
Aquí, está especificando id = 1, por lo que es mejor que use la UPDATE
instrucción para actualizar el registro existente. No se recomienda usar una WHERE
cláusula en el caso de INSERT
. Debe usar UPDATE
.
Ahora usando la consulta de actualización: -
UPDATE Users SET weight=160,desiredWeight=145 WHERE id=1;
¿La cláusula WHERE se puede utilizar realmente con INSERT-INTO-VALUES en cualquier caso?
La respuesta es definitivamente no.
Agregar una cláusula WHERE después de INSERT INTO ... VALUES ... es solo SQL no válido y no se analizará.
El error devuelto por MySQL es:
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 más importante del mensaje de error es
... syntax to use near 'WHERE id = 1' ...
que muestra la parte específica que el analizador no esperaba encontrar aquí: la cláusula WHERE.
No. Hasta donde sé, no puede agregar la cláusula WHERE en esta consulta. Tal vez también he olvidado mi SQL, porque de todos modos no estoy realmente seguro de por qué lo necesitas.
No debe usar la condición where en la instrucción Insert. Si desea hacerlo, use insertar en una declaración de actualización y luego actualice un registro existente.
En realidad, ¿puedo saber por qué necesita una cláusula where en la instrucción Insert?
Tal vez en base a la razón por la que podría sugerirle una mejor opción.
Creo que su mejor opción es usar REPLACE en lugar de INSERT
REEMPLAZAR EN VALORES de usuarios (id, peso, peso deseado) (1, 160, 145);
No tiene sentido ... incluso literalmente
INSERT
significa agregar ay new row
cuando dice WHERE
que define de qué fila está hablando en el SQL
.
Por lo tanto, no es posible agregar una nueva fila con una condición en una fila existente.
Tienes que elegir entre los siguientes:
A. Usar en UPDATE
lugar deINSERT
B. Use INSERT
y elimine la WHERE
cláusula (solo lo digo ...) o si está realmente obligado a usar INSERT
y WHERE
en una sola declaración, solo se puede hacer a través de la cláusula INSERT..SELECT ...
INSERT INTO Users( weight, desiredWeight )
SELECT FROM Users WHERE id = 1;
Pero esto tiene un propósito completamente diferente y si ha definido la identificación como Clave primaria, esta inserción será un error; de lo contrario, se insertará una nueva fila con id = 1.
Soy consciente de que esta es una publicación antigua, pero espero que esto ayude a alguien, con lo que espero sea un simple ejemplo:
antecedentes:
Tuve un caso de muchos a muchos: el mismo usuario aparece varias veces con múltiples valores y quería crear un nuevo registro, por lo tanto, ACTUALIZAR no tendría sentido en mi caso y necesitaba dirigirme a un usuario en particular tal como lo haría usando una cláusula WHERE.
INSERT into MyTable(aUser,aCar)
value(User123,Mini)
Al usar esta construcción, en realidad se dirige a un usuario específico (user123, que tiene otros registros), por lo que realmente no necesita una cláusula where, supongo.
la salida podría ser:
aUser aCar
user123 mini
user123 HisOtherCarThatWasThereBefore
La sintaxis correcta para la inserción de mysql en la declaración utilizando el método de publicación es:
$sql="insert into ttable(username,password) values('$_POST[username]','$_POST[password]')";
no creo que podamos usar la cláusula where en la instrucción insert
INSERT INTO Users(weight, desiredWeight )
SELECT '$userWeight', '$userDesiredWeight'
FROM (select 1 a ) dummy
WHERE '$userWeight' != '' AND '$userDesiredWeight'!='';
No puedes usar INSERT y WHERE juntos. Puede usar la cláusula UPDATE para agregar valor a una columna en particular en un campo en particular, como el siguiente código;
UPDATE Users
SET weight='160',desiredWeight ='145'
WHERE id =1
Creo que la forma correcta de insertar un valor en una fila específica es:
UPDATE table SET column = value WHERE columnid = 1
funciona y es similar si escribe en Microsoft SQL Server
INSERT INTO table(column) VALUES (130) WHERE id = 1;
en mysql tienes que actualizar la tabla.