2016-05-23 76 views
0

此問題可能已被問到某處,但我似乎無法在多次搜索後找到它。如果行更改,MySQL更改表更改列拋出錯誤

我有一個基本的問題,我可以如何防止我的代碼中的最後一條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表中的外鍵。這種將新產品類型添加到允許列表中的方法需要插入語句。