2010-07-27 5 views
5

chciałem rozwiązanie wstawić rekord, jeśli go tam nie ma więc tutaj szukałem i znalazłem rozwiązanie, ale mam inny problemwkładka jeśli nie istnieje w SQL, duplikat nazwy kolumny

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 

wyjściowego jest

#1060 - Duplicate column name '2' 

jeśli użyłem żadnych 2 numery, które nie są identyczne, to będzie działać, ale problem pojawia się, gdy numery 2 są takie same

Odpowiedz

13

najmniejsza zmiana zrobić swoją pracę SQL jest dodanie aliasów do twój sele Oświadczenie 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 

Jednak jeśli masz wyjątkową presję na (question_id, subject_id) następnie można użyć INSERT IGNORE zamiast:

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

To bardzo pomogło mi tutaj: 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 

Twój SELECT z podzapytania jest dziwne, niepotrzebne, ale problem było to, że nie nazwałeś kolumn, które zostały wybrane. W przypadku używania wystarczy wybrać raczej 1, a nie pole. Również limit 1 nie był konieczny.

+0

Masz błąd w swojej składni SQL ; sprawdź instrukcję, która odpowiada twojej wersji serwera MySQL dla właściwej składni do użycia w pobliżu "WHERE NOT EXISTS ( SELECT 1 FROM closed_answers WHERE question_id = 2 AND subje" w linii 3 –

+0

good call Mark .. Usunąłem ten drugi przykład, który był bardzo głupi ze mnie mózg – Fosco

+0

@MarkByers W moim przypadku twoja odpowiedź spowodowała błąd składni, ale odpowiedź Fosco nie zawiera żadnego błędu. Używam MariaDB. –