Этот вопрос, возможно, где-то задавали, но я не могу найти его после долгих поисков.
У меня есть основной вопрос о том, как я могу предотвратить выполнение последнего оператора SQL в моем коде ниже, если это вызвало изменение какой-либо строки / данных в таблице.
$query = 'SELECT pdt_code FROM `Products`';
$stmt = $con->query($query);
while ($obj = $stmt->fetch()) {
$pdt_code[] = $obj['pdt_code'];
}
$args = implode(',',
array_map(function($el) {
return '('.implode(',', $el).')';
},
array_chunk(array_fill(0, count($pdt_code), '?'), count($pdt_code))
)
);
$query = 'ALTER TABLE `MapProduct` CHANGE product_code product_code SET '.$args.' COLLATE utf8mb4_unicode_ci NOT NULL';
$stmt = $con->prepare($query);
$stmt->execute($pdt_code); // how do I prevent this line from executing if it causes the data in table `MapProduct` to change?
Я пытаюсь выполнить это из PHP, где я запрашиваю другую таблицу для обновления кодов продуктов и обновляю SET()
соответственно. Однако у меня был ужасный опыт потери всех моих данных, потому что обновление не было выполнено должным образом, и все данные в product_code
был уничтожен.
Хотя тип данных mysql SET можно использовать для ограничения списка вводимых значений. Тем не менее, он не является гибким и требует изменения таблицы для обновления списка значений. Если вам часто приходится это делать — и если вы создаете для этого функциональность, то вам нужно делать это часто — тогда тип данных SET просто не для вас.
Я бы создал отдельную таблицу для типов продуктов и просто связал бы эту таблицу с внешним ключом из вашей таблицы mapproduct. Таким образом, добавление нового типа продукта в разрешенный список требует оператора вставки.
Других решений пока нет …