2010-06-25 27 views
7

Estoy trabajando con un código. Hay varias consultas cuyo efecto es, si la fila existe con algunos de los datos ingresados, esa fila se actualiza con el resto de los datos, y si la fila no existe, se crea una nueva. Son similares a esto:¿Cómo funciona esta consulta SQL para actualizar una fila si existe, o insertar si no?

 
INSERT INTO table_name (col1, col2, col3) 
SELECT %s AS COL1, %s AS COL2, %s AS COL3 
FROM (SELECT %s AS COL1, %s AS COL2, %s AS COL3) A 
LEFT JOIN table_name B 
ON B.COL1 = %s 
AND B.COL2 = %s  --note: doesn't mention all columns here 
WHERE B.id IS NULL 
LIMIT 1 

que puede imitar este patrón y parece que funciona, pero estoy confundido en cuanto a lo que realmente está pasando detrás de las escenas. ¿Alguien puede dilucidar cómo funciona esto realmente? Estoy usando PostgreSQL.

Respuesta

3

¿Estás seguro de que es la actualización usando solo ese pedazo de código?

Lo que está haciendo es que está haciendo left join con table_name (la tabla para insertar nuevos registros) y filtrando solo para filas que no existen en esa tabla. (DONDE B.id ES NULO)

Es como hacer "no existe", solo de una manera diferente.

Espero que mi respuesta pueda ayudarlo.

Atentamente.

+0

ah así que esto no actualizará realmente una entrada que ya existe? es solo asegurarse de que las filas duplicadas no se creen? – Claudiu

+0

Sí, la cláusula where es solo para asegurarse de que no haya duplicaciones. –

+0

es aquí una diferencia con respecto a algo como: 'INSERT INTO table_name (col1, col2, col3) SELECCIONE% s,% s,% s WHERE NOT EXISTS (SELECCIONE * FROM table_name como T WHERE T.col1 =% s AND T.col2 =% s) '? – Claudiu

1

LEFT JOIN/IS NULL significa que la consulta está INSERTANDO registros que aún no existen. Eso es asumiendo la tabla definida en la cláusula INSERT es el mismo que el de la cláusula LEFT JOIN - cuidado con la abstracción ...

Me interesa saber qué es %s

+0

Sospecho que esta es la cadena de formato para una función tipo 'sprintf()', y '% s' se reemplazará con algún tipo de nombre o valor antes de que el SQL se envíe al DBMS. –

+0

sí, el% s es datos (puede suponer que es "foo", "bar", "baz" para este ejemplo) para poner en la tabla. – Claudiu

Cuestiones relacionadas