これは、mysql-query の文字列を準備するためのものです。問題はNULLについてです。「d」列のみをNULLにしたい(データ配列でnullとして設定されている場合)。問題は、null の場合は「isset」が false であり、設定されていない場合は「is_null」も true になることです。
それで、どうすればそれを修正できますか?
私はphpで以下を持っています:
<?
$data = array(
array('id' => 1, 'c' => '', 'd' => NULL, 'e' => '', 'f' => '', 'i' => 'ciao', 'j' => '', 'k' => ''),
array('id' => 2, 'b' => '', 'c' => '', 'd' => NULL, 'e' => '', 'f' => 'hello', 'g' => '', 'h' => '', 'i' => ''),
);
$col = array('id', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k');
$insert = $update = array();
foreach (array_values($data) as $key => $val){
$val_stack = array();
$insert[$key] = "(";
foreach ($col as $c){
if (isset($val[$c]) && is_null($val[$c])) $val_stack[] = 'NULL';
else if (isset($val[$c])) $val_stack[] = "'".$val[$c]."'";
else $val_stack[] = "''";
}
$insert[$key] .= implode(', ', $val_stack).")";
}
foreach (array_diff($col, array('id')) as $v){
$update[] = $v == 'd' ? "$v=COALESCE(VALUES($v), $v)" : "$v=VALUES($v)";
}
echo "INSERT INTO table (".implode(', ', $col).") VALUES ".implode(', ', $insert)." ON DUPLICATE KEY UPDATE ".implode(', ', $update);
?>
この出力:
INSERT INTO テーブル (id、b、c、d、e、f、g、h、i、j、k) VALUES ('1'、''、''、''、''、''、''、 '', 'ciao', '', ''), ('2', '', '', '', '', 'こんにちは', '', '', '', '', '')重複キー更新時 b=VALUES(b), c=VALUES(c), d=COALESCE(VALUES(d), d), e=VALUES(e), f=VALUES(f), g=VALUES(g) 、h=VALUES(h)、i=VALUES(i)、j=VALUES(j)、k=VALUES(k)
内部の「foreach」() の「isset」にコメントを付けると、次のif (/* isset($val[$c]) && */is_null($val[$c]))
ように出力されます。
INSERT INTO table (id, b, c, d, e, f, g, h, i, j, k) VALUES ('1', NULL , '', NULL , '', '', NULL, NULL , ' ciao', '', ''), ('2', '', '', NULL , '', 'hello', '', '', '', NULL, NULL ) ON DUPLICATE KEY UPDATE b=VALUES (b)、c=VALUES(c)、d=COALESCE(VALUES(d)、d)、e=VALUES(e)、f=VALUES(f)、g=VALUES(g)、h=VALUES(h) 、i=VALUES(i)、j=VALUES(j)、k=VALUES(k)
私が望む出力:
INSERT INTO table (id, b, c, d, e, f, g, h, i, j, k) VALUES ('1', '', '', NULL , '', '', '', ' ', 'ciao', '', ''), ('2', '', '', NULL , '', 'hello', '', '', '', '', '') ON DUPLICATEキー更新 b=VALUES(b), c=VALUES(c), d=COALESCE(VALUES(d), d), e=VALUES(e), f=VALUES(f), g=VALUES(g), h =VALUES(h)、i=VALUES(i)、j=VALUES(j)、k=VALUES(k)