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;
我正在尝试创建 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;