У меня быстрый вопрос … Я обновляю все значения подряд, используя подготовленный оператор и массив.
При первоначальной вставке мое утверждение выглядит так (и работает отлично)
$sql="INSERT INTO $dbtable VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
Первое и последнее значения NULL
первым является поле идентификатора с автоматическим приращением, а последним — поле отметки времени.
Есть ли способ сохранить мой UPDATE
утверждение так же просто, как мой INSERT
утверждение как это …
$sql="UPDATE $dbtable SET (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) WHERE `announcements`.`id` = $id LIMIT 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. У этого также есть побочные эффекты на внешние ключи.
Решение, которое я могу придумать, не включает UPDATE
совсем.
DELETE FROM $dbtable WHERE id = $id;
INSERT INTO $dbtable VALUES ($id, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);
Так как вы не хотите использовать UPDATE
синтаксис, это удалит строку и добавит новую строку с тем же идентификатором, существенно обновив ее. Я бы порекомендовал заключить его в транзакцию, чтобы вы не потеряли свою предыдущую строку, если вставка не удалась по любой причине.