MySQL Условная Вставка. Работает в phpMyAdmin, но не в PHP Script

Я пытаюсь создать условную вставку в моей базе данных MySQL из сценария PHP. Следующий синтаксис SQL работает в phpMyAdmin, но не в моем скрипте PHP:

INSERT INTO profiles (id, firstname)
SELECT "22","John" from profiles
WHERE NOT EXISTS (
SELECT * FROM li_profiles
WHERE li_p_firstname = "John"
)

(Обратите внимание, что "id" является первичным ключом, "firstname" не является ключом или уникальным)

Что-то странное, что может быть частью проблемы, заключается в том, что когда я запускаю этот SQL в phpMyAdmin, пока он "работает" (имеется в виду, что добавляется новая запись с идентификатором "22" и именем "Джон"), я получаю следующее предупреждение: "#1062 - Дублирующая запись '22' для ключа 1" Но в таблице не было предыдущей записи с идентификатором 22.??!!

В чем дело?

3 ответа

Вы получите дубликат записи для iD, потому что вы вставляете новую строку для каждой строки в profiles Таблица; для каждого ряда в profiles таблицы нет Джона в li_profiles Таблица. Вы можете попробовать

INSERT INTO profiles (id, firstname)
    SELECT "22","John" from profiles
        WHERE NOT EXISTS (SELECT * FROM li_profiles
                              WHERE li_p_firstname = "John")
        LIMIT 1;

что бы устранить проблему дублирования (если это работает, извините, но я не проверял это сам).

Я понял это по-другому. (Мне сказали, что оператор HAVING медленный, поэтому я не уверен, что это лучший способ... но это единственный метод, который я получил.)

INSERT INTO profiles (id,firstname)
SELECT 22,'John'
FROM li_profiles
WHERE firstname = 'John'
HAVING COUNT(*) = 0;

Изменить SELECT на VALUES

INSERT INTO profiles (id, firstname) VALUES("22","John") FROM profiles WHERE NOT EXISTS ( SELECT * FROM li_profiles WHERE li_p_firstname = "John" )

Также, если вы используете автоинкрементные значения, вы должны указать следующее значение. Также, если это целое число, укажите целое число (22), а не строку ("22")

Другие вопросы по тегам