我有一个用户表单,用户填写以下详细信息
a)用户名b)密码c)电子邮件
用户名和密码属于users
表,而电子邮件属于contacts
表,现在用户表具有外键contact_id
,用于存储联系人的主键ID。每当用户提交表单时,我必须制作两个MySQL查询以将记录插入两个不同的表中。
这是我正在使用的。
首先查询:
$sth = $this->dbh->prepare("INSERT INTO contacts(email) VALUES(:email)");
第二次查询:
$sth = $this->dbh->prepare("INSERT INTO users(username,password,registerdate,activationString,contact_id) VALUES(:username,:password,NOW(),:activationString,".$this->dbh->lastInsertId().")");
无论如何我可以将查询分成一个而不是两个?利用MySQL的last_insert_id()函数。 ?
谢谢
答案 0 :(得分:2)
INSERT语句允许插入一个表。
但是你可以创建一个存储过程来完成这项工作。
示例:强>
CREATE TABLE contacts(
id INT(11) NOT NULL AUTO_INCREMENT,
email VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (id)
);
CREATE TABLE users(
id INT(11) NOT NULL AUTO_INCREMENT,
username VARCHAR(255) DEFAULT NULL,
`password` VARCHAR(255) DEFAULT NULL,
registerdate DATE DEFAULT NULL,
activationString VARCHAR(255) DEFAULT NULL,
contact_id VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (id)
);
DELIMITER $$
CREATE
PROCEDURE add_new_user(IN p_username VARCHAR(255),
IN p_password VARCHAR(255),
IN p_registerdate DATE,
IN p_activationString VARCHAR(255),
IN p_email VARCHAR(255)
)
BEGIN
INSERT INTO contacts (email) VALUES (p_email);
INSERT INTO users (username, password, registerdate, activationString, contact_id) VALUES (p_username, p_password, p_registerdate, p_activationString, LAST_INSERT_ID ());
END
$$
DELIMITER ;
SET @p_username = 'user1';
SET @p_password = 'pwd';
SET @p_registerdate = now();
SET @p_activationString = 'str';
SET @p_email = 'addr@host.net';
CALL database3.add_new_user(@p_username, @p_password, @p_registerdate, @p_activationString, @p_email);
存储过程是可选的,您可以使用两个插入语句。