Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以使用单个MySQL查询在多个表中插入记录?_Mysql_Database - Fatal编程技术网

是否可以使用单个MySQL查询在多个表中插入记录?

是否可以使用单个MySQL查询在多个表中插入记录?,mysql,database,Mysql,Database,我有一个用户表单,用户在其中填写以下详细信息 a) 用户名b)密码c)电子邮件 用户名和密码属于用户表,而电子邮件属于联系人表,现在用户表有外键联系人id,它存储联系人的主键id。每当用户提交表单时,我必须进行两次MySQL查询,以便将记录插入到两个不同的表中 这是我正在使用的 第一次查询: $sth = $this->dbh->prepare("INSERT INTO contacts(email) VALUES(:email)"); 第二次查询: $sth = $this-&g

我有一个用户表单,用户在其中填写以下详细信息

a) 用户名b)密码c)电子邮件

用户名和密码属于
用户
表,而电子邮件属于
联系人
表,现在用户表有外键
联系人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().")");
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);
我是否可以将查询变成一个而不是两个?使用MySQL last_insert_id()函数


谢谢

INSERT语句允许插入到一个表中

但是您可以创建一个存储过程来完成这项工作

示例:

$sth = $this->dbh->prepare("INSERT INTO users(username,password,registerdate,activationString,contact_id) VALUES(:username,:password,NOW(),:activationString,".$this->dbh->lastInsertId().")");
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);

存储过程是可选的,您可以使用两个insert语句。

这个存储过程是什么?