こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

別々のテーブルで共通のid使う

一つのページから別々のテーブルにデータをINSERTしたいのですが、"id"と"number"は同じ値でそれぞれのテーブルにいれたいのですが、どうやってやるのでしょうか?
下のPHPのコード(一部)でデータを流してみたのですが、このままやると、もしデータに不具合があって片方だけ登録されないことがあると、一方は登録されて、一方は登録されないという事態が発生してしまい、"id"が違う番号で登録されてしまう可能性があります。
id int(8) NOT NULL AUTO_INCREMENT
で"id"は作りました!

$insertSQL1 = sprintf("INSERT INTO tbl1 (id, number, name, price) VALUES (%s, %s, %s, %s)",
GetSQLValueString($_POST['id'], "int"),
GetSQLValueString($_POST['number'], "text"),
GetSQLValueString($_POST['name'], "text"),
GetSQLValueString($_POST['price'], "int"));

$insertSQL2 = sprintf("INSERT INTO tbl2 (id, number, ename, eprice, extra) VALUES (%s, %s, %s, %s, %s)",
GetSQLValueString($_POST['id'], "int"),
GetSQLValueString($_POST['number'], "text"),
GetSQLValueString($_POST['ename'], "text"),
GetSQLValueString($_POST['eprice'], "int"),
GetSQLValueString($_POST['extra'], "text"));

別々のテーブルで共通のidを使う方法はないでしょうか?
phpMyAdminのSQLを使ってます。
回答よろしくおねがいします!

投稿日時 - 2014-12-08 13:00:12

QNo.8851256

すぐに回答ほしいです

質問者が選んだベストアンサー

共通id にauto_increment値は使わない意見に賛成。
その場合でも、トランザクションにしないと、片方のテーブルにのみ挿入できてもう一方は挿入されない事態は発生する。
mysql_(iが付かない)関数群はトランザクション機能の無かった時代の遺物なので(トランザクションもトリガーも未対応)、 mysqliクラスかPDOクラス群を使って下さい。
あと、mysql サーバーのversion が5.1 以降であることと、テーブル作成時に innodb エンジンを指定している必要があります。

投稿日時 - 2014-12-09 14:04:06

お礼

PDOクラスってものがあるんですね!知りませんでした!
まだまだ知らないことが多そうなのでもっと勉強します!

回答ありがとうございました!

投稿日時 - 2014-12-16 23:38:37

このQ&Aは役に立ちましたか?

8人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(4)

ANo.3

>調べてたら、Commitにあたる部分はあったのですが、autocommitの方が見つからなかったのです。

当方、Mysqlは知りませんので、お力になれません。すいません。

投稿日時 - 2014-12-08 19:41:37

お礼

いえいえ、とてもためになりました!
回答ありがとうございます!

投稿日時 - 2014-12-08 19:43:18

ANo.2

考え方が間違っています

>id int(8) NOT NULL AUTO_INCREMENT

オートインクリメントでつくるidを連携用のIDに利用するのは
あまり頭のいいやり方ではありません。
オートインクリメントでつくったプライマリーキー(?)はあくまで
レコードを特定するためのキーにしか(保障がないという意味で)利用できません

任意のルールできちんと生成したIDを元に処理するようにしてください

もしくはなんらかのトリガーを利用して、別テーブルにデータを吐き出す
ような仕組みにすればよいでしょう

投稿日時 - 2014-12-08 15:10:58

お礼

なるほど!
そういう考え方もあるんですね!
回答ありがとうございます!

投稿日時 - 2014-12-08 19:21:08

ANo.1

>一方は登録されて、一方は登録されないという事態が発生してしまい

この事態を防ぐために「トランザクション」という考え方があります。

insert
insert
insert
のあとにcommitすればテーブルが更新されます。
逆にrollbackすればテーブルの更新はありません。

commit,rollbackの処理でエラーが生じることはありません。
もしあるとすればデータベースのシステムが壊れています。

投稿日時 - 2014-12-08 13:05:44

補足

回答ありがとうございます!
mysqli_autocommit($link, FALSE);
mysqli_commit($link)
を使ってみたのですが、普段使ってるのが
mysql_select_db($database, $link);
のようなmysqlのあとに"i"がない形なのですが、
調べてたら、Commitにあたる部分はあったのですが、autocommitの方が見つからなかったのです。
これに対する解決策があったら教えてくれるとありがたいです。
よろしくおねがいします!

投稿日時 - 2014-12-08 19:13:19

お礼

回答ありがとうございます!

投稿日時 - 2014-12-08 19:44:06

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-