MySQL: insert procedure, with variable from another table
MySQL: insert procedure, with variable from another table
我有两个 table:
CREATE TABLE userTypes (
id INTEGER NOT NULL PRIMARY KEY,
type VARCHAR(50) NOT NULL
);
CREATE TABLE users (
id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
email VARCHAR(50) NOT NULL,
userTypeId INTEGER NOT NULL,
FOREIGN KEY (userTypeId) REFERENCES userTypes(id)
);
INSERT INTO userTypes (id, type) VALUES (0, 'free');
INSERT INTO userTypes (id, type) VALUES (1, 'paid');
我想创建一个过程,它在用户 table 中插入一个用户,其中:
- id 自动递增。
- email 等于 email 参数。
- userTypeId是type属性等于type参数的userTypes行的id
INSERT
函数不适用于 WHERE
,所以我尝试添加一个 UPDATE
但它不起作用。这是我目前拥有的:
DELIMITER //
CREATE PROCEDURE insertUser(
IN type VARCHAR(50),
IN email VARCHAR(50)
)
BEGIN
INSERT INTO users(id, email, userTypeID) VALUES (LAST_INSERT_ID(), email, userTypeID);
UPDATE users SET users.userTypeID = usertypes.id
WHERE usertypes.type = type;
END//
DELIMITER ;
预期的结果应该是这样的:
CALL insertUser('free', 'name_1@mail.com');
CALL insertUser('paid', 'name_2@mail.com');
SELECT * FROM users;
id email userTypeId
------------------------------------------
1 name_1@mail.com 0
2 name_2@mail.com 1
省略 auto_increment-column。顾名思义,数据库会自动填充它。
然后,使用与列名称不同的参数名称。您可以在参数中使用前缀。
此外,您可以考虑使用 userTypeId
整数值而不是文本值作为参数。否则你需要处理传递的类型不在 userTypes
中的类型的情况(创建一个新的 one/reject 插入)。
DELIMITER //
CREATE PROCEDURE insertUser(
in_type VARCHAR(50),
in_email VARCHAR(50)
)
BEGIN
INSERT INTO users(email, userTypeID)
SELECT in_email, id
FROM userTypes
WHERE type=in_type;
IF (ROW_COUNT()=0) THEN
SELECT 'Error';
ELSE
SELECT 'OK';
END IF;
END//
DELIMITER ;
我有两个 table:
CREATE TABLE userTypes (
id INTEGER NOT NULL PRIMARY KEY,
type VARCHAR(50) NOT NULL
);
CREATE TABLE users (
id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
email VARCHAR(50) NOT NULL,
userTypeId INTEGER NOT NULL,
FOREIGN KEY (userTypeId) REFERENCES userTypes(id)
);
INSERT INTO userTypes (id, type) VALUES (0, 'free');
INSERT INTO userTypes (id, type) VALUES (1, 'paid');
我想创建一个过程,它在用户 table 中插入一个用户,其中:
- id 自动递增。
- email 等于 email 参数。
- userTypeId是type属性等于type参数的userTypes行的id
INSERT
函数不适用于 WHERE
,所以我尝试添加一个 UPDATE
但它不起作用。这是我目前拥有的:
DELIMITER //
CREATE PROCEDURE insertUser(
IN type VARCHAR(50),
IN email VARCHAR(50)
)
BEGIN
INSERT INTO users(id, email, userTypeID) VALUES (LAST_INSERT_ID(), email, userTypeID);
UPDATE users SET users.userTypeID = usertypes.id
WHERE usertypes.type = type;
END//
DELIMITER ;
预期的结果应该是这样的:
CALL insertUser('free', 'name_1@mail.com');
CALL insertUser('paid', 'name_2@mail.com');
SELECT * FROM users;
id email userTypeId
------------------------------------------
1 name_1@mail.com 0
2 name_2@mail.com 1
省略 auto_increment-column。顾名思义,数据库会自动填充它。
然后,使用与列名称不同的参数名称。您可以在参数中使用前缀。
此外,您可以考虑使用 userTypeId
整数值而不是文本值作为参数。否则你需要处理传递的类型不在 userTypes
中的类型的情况(创建一个新的 one/reject 插入)。
DELIMITER //
CREATE PROCEDURE insertUser(
in_type VARCHAR(50),
in_email VARCHAR(50)
)
BEGIN
INSERT INTO users(email, userTypeID)
SELECT in_email, id
FROM userTypes
WHERE type=in_type;
IF (ROW_COUNT()=0) THEN
SELECT 'Error';
ELSE
SELECT 'OK';
END IF;
END//
DELIMITER ;