1

ユーザー名とその他のデータを格納するユーザー用のこのテーブルがあります。これは次のように行われます(削除されます):

 CREATE TABLE `prod_users` (
        `p_user_id` INT(11) NOT NULL AUTO_INCREMENT,
        `p_user_name` VARCHAR(200) NOT NULL DEFAULT ''
            `p_comp_name` VARCHAR(300) NOT NULL DEFAULT '',
        PRIMARY KEY (`p_user_id`)
    )
    COLLATE='utf8_general_ci'
    ENGINE=MyISAM

ユーザーがサインアップするたびに、会社名も提供します。

prod_profiles という別のテーブルがあり、電話番号などのプロファイルの詳細が保存されます。ファックス番号 等

CREATE TABLE `prod_profiles` (
        `pf_gen_id` INT(11) NOT NULL AUTO_INCREMENT,
            `pf_user_id` INT(11) NOT NULL DEFAULT '0',
        `pf_user_name` VARCHAR(200) NOT NULL DEFAULT ''
            `pf_comp_name` VARCHAR(300) NOT NULL DEFAULT '',
        PRIMARY KEY (`pf_gen_id`)
    )
    COLLATE='utf8_general_ci'
    ENGINE=MyISAM

新しいユーザーがサインアップし、その詳細が prod_users に追加されると、MySql 自体を使用して、新しい user_id、user_name、および comp_name の詳細を prod_profile に自動的に追加できますか? 各ユーザーには新しい p_user_id があり、それがわからないため、php を使用するのは困難です。問題なく MySql 自体の内部でこれを達成できますか?

4

2 に答える 2

1

次の mysql 関数を使用できます。LAST_INSERT_ID();これは、最後に自動増加された ID を返します。

したがって、ユーザーを追加してから を追加するprod_profileと、pf_user_id値は の戻り値になりlast_insert_id()ます。

INSERT INTO `prod_users`(`p_user_name`,`p_comp_name`) VALUES('Dan' , 'Stackover')
INSERT INTO `prod_profiles`(`pf_user_id`,`pf_user_name`,`pf_comp_name`) VALUES(LAST_INSERT_ID(),'Dan','Stackover')

注意してください: 同じユーザーの username と company_name を 2 つの異なるテーブルに 2 回格納するのは、本当に無駄なことです...

DB 構造とロジックについて再考することを検討してください。

于 2012-08-25T15:46:07.507 に答える
1

PHP を使用することは難しくありません。なぜなら、またはLAST_INSERT_ID()を介し​​て、または API が提供するものは何でも使用できるからです。同じスクリプトで 2 つのステートメントを連続して呼び出す限り(接続に依存します)、MySQL は正しい.mysql_insert_id()mysqli::$insert_idPDO::lastInsertId()INSERTp_user_id

ただし、AFTER INSERTトリガーを使用して、MySQL に新しい行を自動的に作成させることができます。

CREATE TRIGGER build_profile AFTER INSERT ON prod_users
FOR EACH ROW
BEGIN
  INSERT INTO prod_profiles 
    (pf_user_id, pf_user_name, pf_comp_name) 
    VALUES (NEW.p_user_id, NEW.p_user_name, NEW.p_comp_name)
END

詳細とオプションについては、MySQL CREATE TRIGGER構文リファレンスを確認してください。

于 2012-08-25T15:46:55.520 に答える