2016-10-07 13 views
1

主キーが重複している場合は、挿入レコードを処理して列値を更新する必要があるクエリを処理しています。私のテーブルには5列を持ち、JSONオブジェクトに、私は5mysqlの重複キー更新時に更新されない列を無効にする方法

のうち、唯一の2つまたは3つの列を有することができる

{ 
    "col1": "val1", 
    "col2": "val2", 
    ..... 
} 

以下のように私の場合のカラム名と値で

はJSONオブジェクトとして来ています

今すぐクエリで更新されない列を無効にするにはどうすればよいですか?

これはこれまで私が試したことです。

$columns = implode(', ', array_keys($requirement)); 
$values = array_values($requirement); 
$placeholders = implode(', ', array_fill(0, count($values), '?')); 

$updatedReq = $requirement; 
unset($updatedReq['requirement_id']); 
unset($updatedReq['buyer_id']); 

$updated = array_keys($updatedReq); 
array_walk($updated, function(&$value, $key) { $value .= '= ?'; }); 
$updatedPlaceholders = implode(', ', $updated); 
$updatedVal = array_values($updatedReq); 

$finalVal = array_merge($values, $updatedVal); 

$sql = "INSERT INTO requirements ($columns) VALUES ($placeholders) ". 
        "ON DUPLICATE KEY UPDATE $updatedPlaceholders"; 
$db->query($sql); 
$db->executeWithArray($finalVal); 

$要件は、列名としてキーを持つ連想配列で、値がテーブルに

テーブル構造

CREATE TABLE requirement(
     id integer PRIMARY KEY AUTO_INCREMENT, 
     col1 varchar(20) DEFAULT NULL, 
     col2 varchar(20) DEFAULT NULL, 
     col3 varchar(20) DEFAULT NULL, 
     col4 varchar(20) DEFAULT NULL, 
     col5 varchar(20) DEFAULT NULL, 
     created datetime DEFAULT CURRENT_TIMESTAMP, 
     updated datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 
) 

NOTEを更新する値です:INTOはオプションではありませんREPLACE列の1つに値を更新するときに変更しないでください。

+0

テーブルの構造を教えてください。 – rbr94

+0

テーブル構造 –

答えて

1

あなたがそうのようなVALUES()機能を使用して、影響を与えたいすべての列含まれるように、あなたのON DUPLICATE KEYを拡張:あなたのINSERTは、指定した列の値を通過しなかった場合は、VALUES(`unpassed_column`)NULLが得られます

ON DUPLICATE KEY UPDATE 
    `val1` = VALUES(`val1`), 
    `val2` = VALUES(`val2`), 
    `val3` = VALUES(`val3`), 
    `val4` = VALUES(`val4`), 
    `val5` = VALUES(`val5`) 

をし、これは、その行のために新たに保存された値になります。

+0

で編集しました。あなたはcol1、col2 ....を意味します。val1、val2 ...の代わりに、Right? –

+0

名前が何であっても、これをテストするときに列が混在している可能性があります。あ、はい。 –

+0

ありがとうございました。 –

関連する問題