mySQL INSERT INTO ON DUPLICATE KEY — не знаю, что не работает

Я просто попытался получить запрос 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");

Что бы все было одинаково, верно?

Ну, я был бы очень очень рад, если бы кто-нибудь мог помочь мне здесь. Я должен делать что-то совершенно не так …

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 существует.

Я не действительно рекомендую это. Лучше у вас должен быть автоматически увеличивающийся идентификатор. Я не думаю, что вышеупомянутая логика является многопользовательской безопасностью во всех механизмах хранения, но она может решить вашу проблему.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]