MySQL过程在插入不工作之前检查记录是否存在

Kac*_*ser 2 mysql stored-procedures insert exists not-exists

我已经在这里查看了其他问题.它不起作用.

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
Run Code Online (Sandbox Code Playgroud)

所以如果我跑:

CALL `environment`.`environment_admin`('22','1','kacieh','512c9ad228332bbd30d09ce7ffb8896e00a1610e914a5fa180bf15ce702b90423e6a9540579f672315ae3c6cb1b8d06ee2b784b4761e806675aa88c2a915553e');
Run Code Online (Sandbox Code Playgroud)

我受到0行的影响,果然,什么也没发生.-_-我这几个小时都在研究条件查询,它有效.我已经测试了存储过程中的insert语句,它也可以.

Par*_*lis 5

停止这样做,效率低下,如果两个insert同时运行可能会更糟!:)

使用INSERT .... ON DUPLICATE KEY UPDATE ... 请参阅此处

一个技巧是ON DUPLICATE KEY UPDATE environment_id = env_id(不更改列,因此不会更新任何内容,确保INSERT在没有任何错误条件的情况下无法工作,您可以在此之后检查已修改/插入的行数)