2010-02-08 15 views
13

¿Hay una consulta que simplemente verificará el registro y si no existe inserte? No quiero duplicar la actualización o reemplazarla. Buscando una solución de consulta, miré otra respuesta pero no realmente lo que esperaba.inserción condicional de mysql - si no existe inserte

Tabla:

name|value|id 
------------------ 
phill|person|12345 

seudo consulta:

IF NOT EXISTS(name='phill', value='person', id=12345) INSERT INTO table_name 
+1

¿Puede aclarar la pregunta un poco? ¿Es id el único campo único? (de una manera rápida y sucia podría usar un índice único y fallará si intenta insertar una fila con un valor duplicado). ¿El nombre y el valor tienen que ser únicos también? –

+0

los tres valores son únicos y no deben estar vacíos. Id tiene un índice, el nombre y el valor también deberían ser diferentes, pero la identificación es imprescindible –

Respuesta

18

Uso REPLACE - funciona exactamente igual que INSERT, excepto que si un viejo fila de la tabla tiene el mismo valor que una nueva fila para una PRIMARY KEY o un índice ÚNICO, la fila anterior se elimina antes de que se inserte la nueva fila.

http://dev.mysql.com/doc/refman/5.0/en/replace.html

-- For your example query 
REPLACE INTO table_name(name, value, id) VALUES 
('phill', 'person', 12345) 

Editar: Como no se puede utilizar REPLACE otra opción es: establecer índices de restricciones para los datos de la tabla (clave principal, la singularidad) y utilizar INSERT IGNORE

INSERT IGNORE INTO table_name 
SET name = 'phill', 
    value = 'person', 
    id = 12345; 
+0

Sí Entiendo la funcionalidad, pero mi usuario solo tiene acceso a SELECCIONAR, INSERTAR, ACTUALIZAR. pero estoy tratando de mantenerme alejado de UPDATE y no sé si tengo permiso para la función REPLACE –

+2

intente INSERT IGNORE – Yada

+0

¿INSERT IGNORE elimina y agrega el registro nuevamente? o simplemente se saltea si se encuentra e inserta si no se encuentra? –

2

¿Qué le parece hacer una inserción desde una consulta de selección que tiene una sub consulta para solo devolver una fila si la fila aún no existe?

Pseudocódigo:

INSERT INTO TABLE_FOO (...) 
SELECT @VAR1, VAR2 ... 
FROM DUMMYTABLE -- THIS TABLE SHOULD CONTAIN 1 RECORD OF ANYTHING 
       -- IN CASE THE FROM IS REQUIRED 
WHERE (SELECT COUNT(*) FROM TABLE_FOO WHERE COLUMN1 = @VAR1) = 0 

Este patrón debería funcionar, sólo tendrá que obtener la sintaxis correcta para MySQL.

+2

Esto fue útil cuando se trata de filas que no usaron claves o exclusiones. – zigg

Cuestiones relacionadas