2016-05-23 6 views
0

この質問はおそらくどこかで尋ねられたかもしれませんが、多くの検索の後でそれを見つけることができないようです。行が変更された場合、MySQL alter table changeカラムスローエラー

テーブルの行/データが変更された場合、以下のコードで最後の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のすべてのデータが消去されたため、私はすべてのデータを失うという恐ろしい経験をしました。

+2

なぜ、ALTER TABLEを自動化する必要がありますか? –

+0

@davidstrachan製品が格納されているテーブルは時々変更されるため、それに応じてSETが更新されなければ、新しい挿入物はすべて拒否されます。 – revvy

+2

この場合、setは使用しないでください。ルックアップテーブルと外部キーを使用して、リストのプロダクトコードを制限します。その場合には、新しいレコードを商品コードルックアップテーブルに挿入するだけです。 – Shadow

答えて

1

mysqlのSETデータ型を使用して、入力する値のリストを制限することができます。ただし、柔軟性がなく、値のリストを更新するにはalter tableが必要です。あなたは頻繁にこれを行う必要があります - それを行うための機能を構築する場合、頻繁にこれを行う必要があります - SETデータ型は単にあなたのためではありません。

私は製品タイプのために別のテーブルを作成しましたが、私は単にmapproductテーブルの外部キーを使ってこのテーブルを参照します。新しい商品タイプを許可リストに追加するには、insert文が必要です。

関連する問題