基于另一个表的插入将值插入到一个表中

时间:2012-08-25 15:41:53

标签: mysql

对于存储用户名和其他数据的用户,我有这个表,就像这样(删除):

 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的表,它存储配置文件详细信息,如phone nos。传真号码等

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本身内实现而没有任何问题吗?

2 个答案:

答案 0 :(得分: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')

请注意:我必须说,在两个不同的表中为同一个用户存储两次用户名和company_name是一种浪费...

考虑重新考虑一下你的数据库结构和逻辑。

答案 1 :(得分: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 syntax reference以获取完整的详细信息和选项。