我已经在这里看了其他问题。它不起作用。
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `environment_admin`(
IN environment_id TEXT,
IN user_id TEXT,
IN username VARCHAR(75),
IN password VARCHAR(512)
)
BEGIN
DECLARE env_id INT;
DECLARE admin_id INT;
SET env_id = CAST(environment_id AS SIGNED INT);
SET admin_id = CAST(user_id AS SIGNED INT);
IF NOT EXISTS(SELECT 1 FROM `environment`.`environment_accounts` WHERE environment_id = env_id AND user_id = admin_id) THEN
BEGIN
INSERT INTO
`environment`.`environment_accounts`
(
`environment_id`,
`user_id`,
`username`,
`password`,
`is_active`,
`is_admin`,
`is_mod`
)
VALUES
(
env_id,
admin_id,
username,
password,
1,
1,
1
);
END;
END IF;
END
所以,如果我跑:
CALL `environment`.`environment_admin`('22','1','kacieh','512c9ad228332bbd30d09ce7ffb8896e00a1610e914a5fa180bf15ce702b90423e6a9540579f672315ae3c6cb1b8d06ee2b784b4761e806675aa88c2a915553e');
我得到了0行 果然,什么都没发生。 -_-我一直在这个时间工作 我测试了条件查询,它的工作原理。 我已经测试了存储过程中的insert语句,它也能正常工作。
答案 0 :(得分:5)
停止这样做,它效率低下,如果两个insert同时运行可能会更糟! :)
使用INSERT .... ON DUPLICATE KEY UPDATE ... see here
一个技巧是ON DUPLICATE KEY UPDATE environment_id = env_id(不更改列,因此不会更新任何内容,确保INSERT在没有任何错误条件的情况下无法工作,您可以在此之后检查已修改/插入的行数)
答案 1 :(得分:2)
我意识到你已经解决了你的问题(对于Parallelis的回答是+1,特别是为了突出并发问题),但以防它可以帮助其他人......
MySQL可能会在您的参数environment_id
和user_id
以及environment_accounts
列environment_id
和user_id
之间感到困惑。我怀疑参数在WHERE
子句中优先,这意味着只要environment_accounts
中至少有一行,NOT EXISTS
子句将始终返回false,并且您的插入永远不会运行
例如,如果您的environment_id
和user_id
参数的值分别为1和2,则NOT EXISTS
子句将评估为
IF NOT EXISTS(SELECT 1 FROM `environment`.`environment_accounts` WHERE 1 = 1 AND 2 = 2) THEN
可能值得为参数(和其他变量)设置命名约定,例如为参数添加p_
之类的前缀。