2010-07-27 18 views
5

que quería una solución para insertar un registro si no está allí, así que busqué aquí y encontré una solución, pero no tengo otro problemaregistro de inserción si no existe en SQL, duplicar nombre de la columna

INSERT INTO closed_answers (question_id, subject_id) 
SELECT * FROM (SELECT 2, 2) AS tmp 
WHERE NOT EXISTS (
    SELECT question_id FROM closed_answers WHERE question_id = 2 AND subject_id = 2 
) LIMIT 1 

la salida es

#1060 - Duplicate column name '2' 

si utilizara cualquiera de los 2 números que no son idénticos que funcionará pero el problema surgirá cuando los 2 números son los mismos

Respuesta

13

el cambio más pequeño para hacer su trabajo de SQL es añadir a los alias tu sele declaración ct:

INSERT INTO closed_answers (question_id, subject_id) 
SELECT * FROM (SELECT 2 AS question_id, 2 AS subject_id) AS tmp 
WHERE NOT EXISTS (
    SELECT question_id 
    FROM closed_answers 
    WHERE question_id = 2 AND subject_id = 2 
) LIMIT 1 

Sin embargo, si usted tiene una restricción única en (question_id, subject_id) entonces puede utilizar INSERT IGNORE lugar:

INSERT IGNORE INTO closed_answers (question_id, subject_id) 
VALUES (2, 2) 
+0

Esta mucho me ayudó aquí: http://stackoverflow.com/questions/3164505/mysql-insert-record-if-not-exists-in-table/3164741#comment33044636_3164741 –

3
INSERT INTO closed_answers (question_id, subject_id) 
SELECT * FROM (SELECT 2 a, 2 b) AS tmp 
WHERE NOT EXISTS ( 
    SELECT 1 FROM closed_answers WHERE question_id = 2 AND subject_id = 2 
) LIMIT 1 

Su instrucción de selección con la sub consulta es extraña una innecesaria, pero el problema fue que no nombraste las columnas seleccionadas. Cuando existe, basta con seleccionar 1, en lugar de un campo. Además, el límite 1 no era necesario.

+0

Usted 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 'DONDE NO EXISTE ( SELECCIONE 1 DE closed_answers WHERE question_id = 2 AND subje' en la línea 3 –

+0

buena marca de llamada ... eliminé ese segundo ejemplo, que fue muy tonto por mi parte. – Fosco

+0

@MarkByers En mi caso, tu respuesta causa el error de sintaxis. Pero la respuesta de Fosco no tiene ningún error. Estoy usando MariaDB. –

Cuestiones relacionadas