如果行更改

时间:2016-05-23 13:21:45

标签: php mysql pdo alter-table

这个问题可能已经在某个地方被问过了,但是经过多次搜索我似乎无法找到它。

我有一个基本的问题,即我如何阻止下面代码中的最后一个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中的所有数据都被删除,我有丢失所有数据的可怕体验。

1 个答案:

答案 0 :(得分:1)

虽然mysql的SET数据类型可用于限制输入的值列表。但是,它不灵活,需要alter table来更新值列表。如果您经常需要这样做 - 并且如果您构建了这样做的功能,那么您需要经常这样做 - 那么SET数据类型根本不适合您。

我会为产品类型创建一个单独的表,我只是使用mapproduct表中的外键引用此表。这样,在允许列表中添加新产品类型就需要插入语句。