MySQL Insertar donde consulta

121

¿Qué hay de malo en esta consulta?

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

Funciona sin la WHEREcláusula. Parece que olvidé mi SQL ...

Taryn
fuente

Respuestas:

237

MySQL INSERT Syntax no es compatible con la cláusula WHERE, por lo que su consulta tal como está, fallará. Asumiendo que su idcolumna 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 idcolumna es una columna de autoincremento, también podría omitirla de su INSERTAR y dejar que mysql la incremente de manera normal.

Abedul Chad
fuente
1
Gracias por una buena respuesta Cuando se utiliza la consulta ACTUALIZACIÓN funciona bien. Pero, cuando id es una clave principal y una clave de incremento automático, la instrucción INSERT anterior no funciona. Error Duplicar la entrada '1' para la clave 1.
JDGuide
1
@JDeveloper Eso es porque la fila ya existe. Como Chad mencionó If you're trying to insert a new row with ID 1 you should be usingINSERTAR 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 ...
SINTOMA
41

No puede combinar una cláusula WHERE con una cláusula VALUES. Tienes dos opciones, que yo sepa,

  1. INSERTAR especificando valores

    INSERT INTO Users(weight, desiredWeight) 
    VALUES (160,145)
  2. INSERTAR usando una instrucción SELECT

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

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.

Rob Prouse
fuente
77
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. desencadenantes y dependencias de clave externa. En su lugar, use INSERTAR ... EN ACTUALIZACIÓN CLAVE DUPLICADA.
Bill Karwin el
10

No creo que el inserto tenga una cláusula WHERE.

Daniel A. White
fuente
¡Eso es verdad y arena al mismo tiempo!
Ingus
5

Insertar consulta no admite dónde palabra clave *

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

Somnath Muluk
fuente
4

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.

sakhunzai
fuente
3

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;
Borniet
fuente
2

Insertar en = Agregar filas a una tabla

Upate = actualizar filas específicas.

¿Qué describiría la cláusula where en su inserción? No tiene nada que coincida, la fila no existe (todavía) ...

Richard L
fuente
2

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'!='';
Igor Vujovic
fuente
1

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?

Frank Nwoko
fuente
¿es posible donde la cláusula en la declaración de inserción
Taja_100
1

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');
Ethan Brooks
fuente
1

Después de la WHEREclá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 .

Revathi
fuente
1

Si está especificando un registro particular no para insertar datos, es mejor usar una UPDATEdeclaración en lugar de una INSERTdeclaració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 UPDATEinstrucción para actualizar el registro existente. No se recomienda usar una WHEREclá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;
JDGuide
fuente
No mate. La primera consulta no funcionará. La primera consulta es la pregunta que se hace.
JDGuide
¿Por qué sugiere actualizar sobre insertar? El usuario desea insertar valores con condición y no actualizar los registros existentes.
Somnath Muluk
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.

Marc Alff
fuente
1

Está totalmente mal. INSERTAR CONSULTA no tiene una cláusula WHERE, solo ACTUALIZAR CONSULTA la tiene. Si desea agregar datos donde id = 1, entonces su consulta será

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

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.

Ikechi Anyanwu
fuente
1

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.

Krishna Thota
fuente
1

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

Alberto León
fuente
1

LEA ESTO BIEN

No tiene sentido ... incluso literalmente

INSERTsignifica agregar ay new rowcuando dice WHEREque 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 UPDATElugar deINSERT

B. Use INSERTy elimine la WHEREcláusula (solo lo digo ...) o si está realmente obligado a usar INSERTy WHEREen 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.

Bharat Sinha
fuente
sí, tienes razón, sabiendo que todas estas cosas despiertan cometen errores.
Asesha George
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
Ylenia88m
fuente
1

Una forma de usar INSERT y WHERE es

INSERT INTO MYTABLE SELECT 953,'Hello',43 WHERE 0 in (SELECT count(*) FROM MYTABLE WHERE myID=953); En este caso es como una prueba de existencia. No hay excepción si lo ejecuta dos o más veces ...

Robar
fuente
0

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]')";
chaitanya koripella
fuente
1
Debe escapar de parámetros no confiables como el nombre de usuario o utilizar consultas parametrizadas para evitar que un atacante inyecte comandos SQL arbitrarios . Y use uno de los algoritmos HashCrypt para almacenar la contraseña.
Hendrik Brummermann
0

no creo que podamos usar la cláusula where en la instrucción insert

Nipun Jain
fuente
0
INSERT INTO Users(weight, desiredWeight )
SELECT '$userWeight', '$userDesiredWeight'  
FROM (select 1 a ) dummy
WHERE '$userWeight' != '' AND '$userDesiredWeight'!='';
usuario6297694
fuente
1
¿Puede editar su respuesta propuesta para ampliar lo que hace y cómo aborda el OP?
Ro Yo Mi
0

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
Vishal Vaishnav
fuente
0

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.

Jonathan JS
fuente
0

Puede hacerlo con el siguiente código:

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