MySQL Условная Вставка. Работает в phpMyAdmin, но не в PHP Script - PullRequest
0 голосов
/ 19 декабря 2010

Я пытаюсь создать условную INSERT в моей базе данных 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 ]

0 голосов
/ 19 декабря 2010

Вы получите дубликат записи для 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;

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

0 голосов
/ 19 декабря 2010

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

INSERT INTO profiles (id,firstname)
SELECT 22,'John'
FROM li_profiles
WHERE firstname = 'John'
HAVING COUNT(*) = 0;
0 голосов
/ 19 декабря 2010

Измените 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")

...