2011-03-15 21 views
9

¿Hay una manera de hacer una inserción en una condición de recuento, algo así como:¿Ejecutar INSERT si la tabla está vacía?

INSERT INTO my_table (colname) VALUES('foo') IF COUNT(my_table) < 1 

Básicamente quiero insertar un único registro por defecto si la tabla está vacía. Estoy usando mysql.

Respuesta

21

Use SELECT en lugar de VALUES para poder expandir la consulta con una cláusula WHERE.

existe es una mejor & prueba más rápido que COUNT

INSERT INTO my_table (colname) 
SELECT 'foo' 
WHERE NOT EXISTS (SELECT * FROM my_table) 
+8

Es posible que necesite utilizar la tabla de relleno ** DUAL ** para que funcione. 'INSERT INTO my_table (colname) SELECCIONE 'foo' FROM DUAL DONDE NO EXISTE (SELECCIONAR * FROM mi_tabla)' – Craig552uk

+0

INSERTAR EN my_table (colname) SELECCIONAR 'foo' FROM (SELECCIONAR 'barra') AS BAR DONDE NO EXISTE (SELECCIONAR * FROM my_table) - tabla ficticia en línea –

+0

@SandeepGB Tabla en línea completamente no solicitada. Esto es MySQL, no Oracle – RichardTheKiwi

2

Una forma sería colocar una clave única en una columna. A continuación, ejecutar una REPLACE:

REPLACE [LOW_PRIORITY | DELAYED] 
    [INTO] tbl_name [(col_name,...)] 
    {VALUES | VALUE} ({expr | DEFAULT},...),(...),... 

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, edad fila se elimina antes de la nueva fila se inserta

+1

+1: Iba a escribir algo así cuando tu respuesta apareció. :) Una alternativa a REPLACE es usar INSERT IGNORE, que generará una advertencia (en lugar de un error) cuando la instrucción no se ejecute. –

0

Esto es más fácil de leer:

INSERT INTO my_table (colname) 
SELECT 'foo' FROM DUAL 
WHERE NOT EXISTS (SELECT * FROM my_table); 

La falta de un VALUES se ve mitigada por el SELECT FROM DUAL que proporcionará los valores. el FROM DUAL no siempre es necesario, pero no está de más incluirlo en configuraciones extrañas donde es necesario (como la instalación de Percona que estoy usando).

El NOT EXISTS es más rápido que hacer un conteo que puede ser lento en una tabla con un gran número de filas.

Cuestiones relacionadas