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

标签 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

所以如果我运行:

CALL `environment`.`environment_admin`('22','1','kacieh','512c9ad228332bbd30d09ce7ffb8896e00a1610e914a5fa180bf15ce702b90423e6a9540579f672315ae3c6cb1b8d06ee2b784b4761e806675aa88c2a915553e');

我有 0 行受到影响 果然,什么也没发生。 -_- 我一直在工作这个时间 我测试了条件查询,它有效。 我只测试了存储过程中的插入语句,它也能正常工作。

最佳答案

别再这样做了,效率很低,如果同时运行两个 insert 会更糟! :)

在重复 key 更新时使用插入.... see here

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

关于MySQL 过程检查记录是否在插入不工作之前存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12189968/

相关文章:

mysql - 查询 select max 混合字符串和整数

sql-server - 将触发器复制行插入另一个重复表 SQL Server 2008

sql - 无法将临时表从一个存储过程传递到另一个存储过程,出现错误 'Must declare scalar variable'

mysql - 选择/插入时出现奇数 CONCAT 错误

Vim 的 '(insert) VISUAL' 模式?

Mysql Group by Year and Count字段

mysql - 存储过程不给出多个输出参数的结果

mysql - 区分大小写的 RLIKE

sql - 使用窗口函数跨分区求和

php - 如何以正确的方式在mysql中创建存储过程