这个问题可能已经在某个地方被问过了,但是经过多次搜索我似乎无法找到它。
我有一个基本的问题,即我如何阻止下面代码中的最后一个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
中的所有数据都被删除,我有丢失所有数据的可怕体验。
答案 0 :(得分:1)
虽然mysql的SET数据类型可用于限制输入的值列表。但是,它不灵活,需要alter table来更新值列表。如果您经常需要这样做 - 并且如果您构建了这样做的功能,那么您需要经常这样做 - 那么SET数据类型根本不适合您。
我会为产品类型创建一个单独的表,我只是使用mapproduct表中的外键引用此表。这样,在允许列表中添加新产品类型就需要插入语句。