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")