Обновите все значения, кроме поля автоинкремента, используя PHP / MySql / PDO

У меня быстрый вопрос … Я обновляю все значения подряд, используя подготовленный оператор и массив.

При первоначальной вставке мое утверждение выглядит так (и работает отлично)

$sql="INSERT INTO $dbtable VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

Первое и последнее значения NULL первым является поле идентификатора с автоматическим приращением, а последним — поле отметки времени.

Есть ли способ сохранить мой UPDATE утверждение так же просто, как мой INSERT утверждение как это …

$sql="UPDATE $dbtable SET (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) WHERE `announcements`.`id` = $id LIMIT 1";

Я понимаю, что это не работает из-за того, что первое значение является полем автоматического приращения, есть ли значение, которое я мог бы вставить в свой массив, чтобы пропустить это поле?

Возможно, это не лучший способ описать мой вопрос, но если вам нужна дополнительная информация, пожалуйста, дайте мне знать!

Заранее спасибо!

1

Решение

UPDATE не имеет синтаксиса «неявных столбцов», таких как INSERT делает. Вы должны назвать все столбцы, которые вы хотите изменить.

Одна альтернатива, которую вы можете использовать в MySQL: REPLACE:

REPLACE INTO $dbtable VALUES (?, ?, ?, ?, ?, ...)

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

Узнайте больше о REPLACE Вот: https://dev.mysql.com/doc/refman/5.6/en/replace.html

Обратите внимание, что это внутренне очень похоже на предложение @ Devon об использовании двух операторов: DELETE с последующим INSERT, Например, когда вы запускаете REPLACE, если у вас есть триггеры, активируются оба триггера ON DELETE, а затем триггеры ON INSERT. У этого также есть побочные эффекты на внешние ключи.

2

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

Решение, которое я могу придумать, не включает UPDATE совсем.

DELETE FROM $dbtable WHERE id = $id;
INSERT INTO $dbtable VALUES ($id, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);

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

1

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