SQL 程序 - 多插入

SQL PROCEDURES - Multi inserts

我正在尝试创建 SQL 将用户注册到系统的过程。 因为用户详细信息需要保存到很多表中, 我做了这个程序及其工作,但 returns 我出错了:

14:47:53    call new_procedure  Error Code: 1242. Subquery returns more than 1 row  0.016 sec

这是我的程序:

 CREATE DEFINER=`root`@`localhost` PROCEDURE `new_procedure`(
  firstname varchar(36), lastname varchar(36), email varchar(36), pass varchar(255), phone varchar(12))
BEGIN
START TRANSACTION;
   INSERT INTO users (`FIRST_NAME`, `LAST_NAME`,`EMAIL`,`PWD`,`PHONE`)
        VALUES(firstname, lastname, email, '123123', phone);
   SET @user_uniqe_id = (SELECT ID FROM users WHERE EMAIL=email);
   INSERT INTO resources (id) 
        VALUES(@user_uniqe_id);
COMMIT;
END

这段代码有问题:

SET @user_uniqe_id = (SELECT ID FROM users WHERE EMAIL=email);

认为其中一封电子邮件提到了参数。但事实并非如此。 where 子句将列与自身进行比较。

我建议给参数命名,不要与列混淆:

CREATE DEFINER=`root`@`localhost` PROCEDURE `new_procedure`(
  in_firstname varchar(36),
  in_lastname varchar(36),
  in_email varchar(36),
  in_pass varchar(255),
  in_phone varchar(12)
)
BEGIN
START TRANSACTION;
   INSERT INTO users (`FIRST_NAME`, `LAST_NAME`,`EMAIL`,`PWD`,`PHONE`)
        VALUES(in_firstname, in_lastname, in_email, '123123', in_phone);
   SET @user_uniqe_id = (SELECT u.ID FROM users u WHERE u.EMAIL = in_email);
   INSERT INTO resources (id) 
        VALUES(@user_uniqe_id);
COMMIT;
END;

这仍然不是正确的方法。您应该使用 last_insert_id()。看起来像:

CREATE DEFINER=`root`@`localhost` PROCEDURE `new_procedure`(
  in_firstname varchar(36),
  in_lastname varchar(36),
  in_email varchar(36),
  in_pass varchar(255),
  in_phone varchar(12)
)
BEGIN
START TRANSACTION;
   INSERT INTO users (`FIRST_NAME`, `LAST_NAME`, `EMAIL`, `PWD`, `PHONE`)
        VALUES (in_firstname, in_lastname, in_email, '123123', in_phone);
   SET @user_uniqe_id = LAST_INSERT_ID();

   INSERT INTO resources (id) 
        VALUES (@user_uniqe_id);
COMMIT;
END;