Я просто попытался получить запрос MySQL INSERT INTO ON DUPLICATE KEY, чтобы начать работу. К сожалению, без удачи.
Я прочитал все много постов по этому вопросу здесь в stackoverflow, я посмотрел на это http://dev.mysql.com/doc/refman/5.5/en/insert-on-duplicate.html, но все равно не повезло …
У меня есть такая таблица:
-------------------------------------------------
| id | option1 | option 2 | option 3 | option 4 |
-------------------------------------------------
| 83 | 0 | 1 | 0 | 0 |
Мой идентификатор — это уникальное значение, но не автоматическое увеличение.
все остальные значения являются логическими значениями, описывающими некоторые выбранные параметры.
Я хотел написать функцию для обновления таблицы, если идентификатор уже существует, или написать новую строку, если у меня есть новый идентификатор.
Я работаю с существующим кодом с классом базы данных.
$this->db = new PDO($host, $user, $password);
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
(не спрашивайте меня о setAttribute. Это именно то, что было в коде …)
и позже:
$this->query = $this->db->prepare("INSERT INTO myTable (id, option1, option2, option3, option4)
VALUES (83, 0, 1, 1, 1) ON DUPLICATE KEY UPDATE id = VALUES(id)");
$this->query->execute();
Я знаю, что на самом деле мне не нужно готовить что-то вроде переплета. (В конце концов, я хочу сделать это, но я не мог понять, как это сделать здесь.
Ну, я не получаю сообщение об ошибке при перехвате исключений PDO, но я не могу обновить свою базу данных.
Давайте предположим, что все, что связано с подключением к БД, в порядке (я могу выбрать данные).
Я также попробовал нотации, как это:
$this->query = $this->db->prepare("INSERT INTO myTable (id, option1, option2, option3, option4)
VALUES (83, 0, 1, 1, 1) ON DUPLICATE KEY UPDATE id = 83");
или же
$this->query = $this->db->prepare("INSERT INTO myTable (id, option1, option2, option3, option4)
VALUES (83, 0, 1, 1, 1) ON DUPLICATE KEY UPDATE id = id + 1");
Что бы все было одинаково, верно?
Ну, я был бы очень очень рад, если бы кто-нибудь мог помочь мне здесь. Я должен делать что-то совершенно не так …
Ты не хочешь on duplicate key update
, Это либо вставляет новый строка. Или это обновляет старый ряд. Вы, кажется, хотите вставить новую строку, но с другим идентификатором в случае конфликта.
Я мог бы предложить что-то вроде этого:
INSERT INTO myTable(id, option1, option2, option3, option4)
select (case when max(id = 83) > 0 then max(id) + 1
else 83
end), 0, 1, 1, 1
from mytable;
Это положит 83
в таблицу, если она не существует. Это поставит максимум id
+1 в случае 83
существует.
Я не действительно рекомендую это. Лучше у вас должен быть автоматически увеличивающийся идентификатор. Я не думаю, что вышеупомянутая логика является многопользовательской безопасностью во всех механизмах хранения, но она может решить вашу проблему.
Других решений пока нет …