2011-02-09 45 views
5

estoy tratando de crear más robustos MySQL consultas y aprender en el proceso. Actualmente estoy teniendo dificultades para comprender la sintaxis ON DUPLICATE KEY y sus posibles usos.declaración mySQL condicional. Si es verdad UPDATE, INSERT si es falso

que tienen un INSERT de consulta que quiero INSERT sólo si no hay ningún registro con el mismo nombre y ID, de lo contrario UPDATE. ID y el nombre no son UNIQUE pero ID se indexa. ID no es UNIQUE porque hace referencia a otro registro de otra tabla y quiero tener varios registros en esta tabla que hacen referencia a que un registro específico de la otra tabla.

¿Cómo puedo usar ON DUPLICATE KEY-INSERT sólo si no hay ningún registro con ese nombre ya ID y establecer otra cosa UPDATE ese registro?

puedo lograr esto fácilmente con un par de QUERIES y luego tener PHP hacer la parte IFELSE, pero quiero saber cómo LIMIT la cantidad de QUERIES que envío a MySQL.

Respuesta

7

ACTUALIZACIÓN: Tenga en cuenta que necesita utilizar IF EXISTS en lugar de IS NULL como se indicó en la respuesta original.

Código para crear procedimiento almacenado para encapsular toda la lógica y comprobar si existen Sabores:

DELIMITER // 

DROP PROCEDURE `GetFlavour`// 
CREATE PROCEDURE `GetFlavour`(`FlavourID` INT, `FlavourName` VARCHAR(20)) 
BEGIN 
IF EXISTS (SELECT * FROM Flavours WHERE ID = FlavourID) THEN 
UPDATE Flavours SET ID = FlavourID; 
ELSE 
INSERT INTO Flavours (ID, Name) VALUES (FlavourID, FlavourName); 
END IF; 
END // 

DELIMITER ; 

ORIGINAL:

Usted podría utilizar este código. Verificará la existencia de un registro en particular, y si el conjunto de registros es NULO, lo revisará e insertará el nuevo registro por usted.

IF (SELECT * FROM `TableName` WHERE `ID` = 2342 AND `Name` = 'abc') IS NULL THEN 
INSERT INTO `TableName` (`ID`, `Name`) VALUES ('2342', 'abc'); 
ELSE UPDATE `TableName` SET `Name` = 'xyz' WHERE `ID` = '2342'; 
END IF; 

estoy un poco oxidado en mi sintaxis de MySQL, pero que el código debería, al menos, se obtiene la mayor parte del camino, en lugar de utilizar una llave duplicada EN.

+0

Obteniendo un error con esto: Tiene un error en su sintaxis SQL; revise el manual que corresponde a su versión del servidor MySQL para la sintaxis correcta para usar cerca de 'IF (SELECCIONAR * FROM sabores WHERE id =' 1 'Y Name =' BerryBlue ') ES NULO ENTONCES' en la línea 1 –

+0

@Vitaliy - I ' he actualizado mi código A ver si eso te ayuda para nada. Si no, intente poner la instrucción INSERT en la misma línea que la instrucción IF. –

+0

Ya lo intenté. También invierte la lógica y todavía me da un error de sintaxis. Incluso reemplacé todos los vars de PHP con valores estáticos sin suerte. –

2

Por qué no utilizar un procedimiento almacenado, a continuación, puede incrustar toda la lógica que hay además de contar con una pieza de código reutilizable (por ejemplo, el procedimiento almacenado) que se puede utilizar en otras aplicaciones. Finalmente, esto solo requiere un viaje de ida y vuelta al servidor para llamar al proceso almacenado.

+0

Soy terriblemente nuevo en SQL y no sé cómo hacer procedimientos almacenados. Tengo mucho que aprender. –

4

id y nombre no son únicos pero la identificación es indexed. Identificación no es única

¿Cómo puedo utilizar Sobre clave duplicada a INSERT sólo si no hay ningún registro con ese ID y el nombre ya establecidos demás ACTUALIZACIÓN ese registro?

No se puede. ON DUPLICATE KEY UPDATE necesita una clave única o principal para determinar qué fila actualizar. Es mejor que PHP haga la parte IF ELSE.

edición:

Si la combinación de nombre y la ID se supone que es único, puede crear un índice único de varias columnas. Desde allí, puede usar ON DUPLICATE KEY UPDATE.

+1

+1 para explicar ese hecho. Parece que tiene una columna de id autoincrementing. En este caso, solo tiene que seleccionar y luego insertar dentro de una transacción. –

+0

Entonces de esta manera necesitaría dos consultas. Uno para SELECCIONAR los campos y luego otro para ACTUALIZAR/INSERTAR. Estoy tratando de ver si puedo hacer esto en una sola consulta. No estoy autoincrementando la columna de id. La identificación se refiere a una identificación única de otro registro en otra tabla. –

+2

Desafortunadamente, sin un índice ÚNICO, no creo que puedas. Internamente, MySQL prueba primero la inserción y luego detecta un "error de clave duplicada" y luego realiza la actualización. REPLACE funciona de la misma manera. Parece que quizás el nombre y el nombre combinados podrían formar un índice ÚNICO. Si es así, crea ese índice combinado y ON DUPLICATE KEY debería funcionar para ti. – mluebke

Cuestiones relacionadas