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_idvalue 将是 的返回值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')

请注意:我不得不说,将同一用户的用户名和公司名两次存储在两个不同的表中是一种真正的浪费......

考虑重新考虑您的数据库结构和逻辑。

于 2012-08-25T15:46:07.507 回答
1

使用 PHP 并不困难,因为您LAST_INSERT_ID()可以使用,无论是通过mysql_insert_id()mysqli::$insert_idPDO::lastInsertId()还是您的 API 提供的任何东西。只要您INSERT在同一个脚本上立即连续调用这两个语句(它取决于连接),MySQL 就会提供正确的p_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 回答