MySQLのUPDATE文の3つのテーブル更新にて1時間以上手間取った。
問題はWHERE句の内容にあった。
$sql =
'UPDATE dat_sales_product
INNER JOIN
mst_product
ON dat_sales_product.code_product=mst_product.code
INNER JOIN
dat_sales
ON dat_sales_product.code_sales=dat_sales.code
SET
dat_sales.name = ?,
dat_sales.date = ?,
dat_sales_product.quantity = ?,
mst_product.name = ?,
mst_product.gazou = ?
WHERE
dat_sales_product.code_product = ?
$stmt = $dbh->prepare($sql);
$data[] = $form['name'];
$data[] = date('Y-m-d H:i:s');
$data[] = $form['quantity'];
$data[] = $form['mst_name'];
$data[] = $_SESSION[filename];
$data[] = $form['code_product'];
$stmt->execute($data);
$dbh = null';
このコードを試してテーブルが更新されない。
3つ以上のテーブルを更新するUPDATE文を書くときには
UPDATEのどこのテーブルのどのカラムかを4つ指定しなければいけなかった。
A,B,Cのテーブルで共通のIDを持っているBのテーブルを軸とするなら、
WHERE句で
A.id = "10"
B.id = "10"
B.id2 = "11"
C.id = "11"
といったように
AのテーブルとBのテーブルの共通項
BのテーブルとCのテーブルの共通項
4つの共通する項目の値を明示しないといけない。
ぐぐっても意外とのっていなかった。
以下のようにすると更新された。
$sql =
'UPDATE dat_sales_product
INNER JOIN
mst_product
ON dat_sales_product.code_product=mst_product.code
INNER JOIN
dat_sales
ON dat_sales_product.code_sales=dat_sales.code
SET
dat_sales.name = ?,
dat_sales.date = ?,
dat_sales_product.quantity = ?,
mst_product.name = ?,
mst_product.gazou = ?
WHERE
dat_sales_product.code_product = ?
AND mst_product.code = ?
AND dat_sales_product.code_sales = ?
AND dat_sales.code = ?';
$stmt = $dbh->prepare($sql);
$data[] = $form['name'];
$data[] = date('Y-m-d H:i:s');
$data[] = $form['quantity'];
$data[] = $form['mst_name'];
$data[] = $_SESSION[filename];
$data[] = $form['code_product'];
$data[] = $form['code_product'];
$data[] = $form['code_sales'];
$data[] = $form['code_sales'];
$stmt->execute($data);
$dbh = null';
同じように2つのテーブルの時は
inner joinの部分を1回だけ
WHERE句の共通カラムの項目を2つ
$data[]の内容を調節
4つのテーブルの時は
inner joinの部分を3回
WHERE句の共通項目を6つのテーブルのカラム
(A,B,C,DのテーブルではA.id=B.id,A.id=C.id,A.id=D.id,B.id=C.id,B.id=D.id,C.id=D.idといったように)
$data[]の内容を調節
で大丈夫でした。
ホント毎回忘れてしまうため、UPDATE文を書くときにはこれから注意して書くようにします。
ごめんなさい。