0

UserData と Response の 2 つのテーブルがあります。

UserDataにはフィールドがあります -

ID smallint unsigned not null auto_increment, 
Name varchar(50)
Age tinyint unsigned
PRIMARY KEY(ID)

応答にはフィールドがあります --

ResponseID smallint auto_increment, 
field1 text,
field2 text,
yesno bit default 0,
User_ID smallint not null unique
PRIMARY KEY(ID)
FOREIGN KEY(User_ID) references UserData(ID)

そして、ユーザーが名前、年齢、フィールド1、フィールド2、およびはいいいえの詳細を入力するフォームがあります

これで、ユーザーのコンピューターからのデータがすべてまとめられますが、データベースに挿入され、最初の 2 つのフィールドが UserData テーブルに入り、残りが Response になります。

私のアプリケーションロジックでは、次のようなことをしたい -

このユーザーの UserData(name,age) を挿入します UserData に新しく挿入された行の ID 列の値を UID として取得します このユーザーの Response(field1,field2,yesno) を挿入します。ここで、User_ID = UID

UserData の ID が 100 の場合、対応する行の Response の User_ID は 100 になります。後でWHERE User_ID = UserData.IDクエリでそのユーザーの応答を取得できるように

それ、どうやったら出来るの?last_insert_id() はそれを行いますか?

4

1 に答える 1

0

MySQL 側で挿入を処理する場合は、はい使用しますLAST_INSERT_ID()

クライアント コード (egphp ) から実行する場合は、 mysql_insert_id()inmysql_*またはlastInsertId()inのように対応するものを使用します。PDO

INSERT INTO UserData (Name, Age) VALUES ('Jhon Doe', 35);
INSERT INTO Response (field1, field2, yesno, User_ID) 
VALUES ('some text', 'more text', 0, LAST_INSERT_ID());

これがSQLFiddleのデモです

更新コメントでの懸念について

生成された ID は、 接続ごとにサーバーに保持されます。これは、関数によって特定のクライアントに返される値が、そのクライアントによって AUTO_INCREMENT 列に影響を与える最新のステートメントに対して生成された最初の AUTO_INCREMENT 値であることを意味します。この値は、他のクライアントが独自の AUTO_INCREMENT 値を生成したとしても、影響を受けることはありません。この動作により、各クライアントは、他のクライアントのアクティビティを気にせず、ロックやトランザクションを必要とせずに、独自の ID を取得できるようになります。

于 2013-09-16T08:28:39.333 に答える