Убедитесь, что запрос будет работать, прежде чем выполнять другой запрос в обратном порядке - PullRequest
2 голосов
/ 20 января 2012

Хорошо, у меня есть функция обновления со странным поворотом.Из-за особенностей структуры я выполняю запрос на удаление, а затем вставляю запрос, а не фактический запрос «Обновление».Они специально запускаются в таком порядке, чтобы новые элементы не были удалены.По сути, элементы удаляются с помощью идентификатора атрибута, который соответствует запросу вставки.Поскольку атрибут не является первичным индексом, «ON DUPLICATE KEY UPDATE» не работает.

Итак, вот дилемма.Во время разработки и тестирования запрос на удаление будет работать без сбоев, но если я использую ввод для запроса INSERT, и он не выполняется, то данные DATA были удалены без повторной вставки, что означает восстановление новых данных теста и дажеХуже того, если произойдет сбой в работе, пользователь потеряет все, над чем работал.

Итак, я знаю, что MySQL проверяет запрос до его фактического выполнения, поэтому можно убедиться, что запрос INSERT проверяетперед выполнением запроса DELETE?

<cfquery name="delete" datasource="DSOURCE">
  DELETE FROM table
  WHERE colorid = 12
</cfquery>

<!--- check this query first before running delete --->
<cfquery name="insert" datasource="DSOURCE">
  INSERT INTO table (Name, ColorID)
  VALUES ("tom", 12)
</cfquery>

Ответы [ 2 ]

3 голосов
/ 20 января 2012

У вас 2 проблемы.

Поскольку атрибут не является первичным индексом, «ON DUPLICATE KEY UPDATE» не работает.

Атрибут не должен быть PRIMARY KEY. Достаточно, если оно определено как UNIQUE KEY, что вы можете сделать без штрафов.

И номер два: если вы хотите выполнить серию запросов последовательно, причем ВСЕ из них успешны, а ни один не провален - термин транзакция Либо все удастся, либо ничего не произойдет. Google о транзакциях MySQL, чтобы получить лучший обзор того, как их использовать.

0 голосов
/ 20 января 2012

Поскольку вы используете WHERE colorid = 12 в качестве критерия удаления, colorid должен быть уникальным ключом. Это дает вам два подхода к этому с помощью одного запроса

UPDTAE table SET NAME="tom"
  WHERE colorid=12

OR

REPLACE INTO table (Name, ColorID)
  VALUES ("tom", 12)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...