MySQL 存储过程插入验证

Posted

技术标签:

【中文标题】MySQL 存储过程插入验证【英文标题】:MySQL stored procedure insert validation 【发布时间】:2019-08-18 03:44:09 【问题描述】:

我有两张桌子acceptancesturnovers。我们假设这些表都只有iddate 列。

我需要能够在 2 个表中插入相同的日期最多 4 次。

例如:5 个用户正在尝试创建预订时间表。

5 个用户中的 3 个创建了接受计划。 5 位用户中有 2 位创建了营业额时间表。

即使在竞争条件下也应拒绝这些插入中的 1 个。

我有以下存储过程:

BEGIN
    DECLARE acceptanceDateEntryCount int;
    DECLARE turnoverDateEntryCount int;

    SELECT COUNT(date) FROM acceptances WHERE DATE(date) = DATE(insertDate) INTO acceptanceDateEntryCount;
    SELECT COUNT(date) FROM turnovers WHERE DATE(date) = DATE(insertDate) INTO turnoverDateEntryCount;

    IF((acceptanceDateEntryCount + turnoverDateEntryCount) < 4) THEN
        INSERT INTO acceptances (date) VALUES (insertDate);
    ELSE
        SIGNAL SQLSTATE
            '45030'
        SET
            MESSAGE_TEXT = 'Cannot create acceptance schedule. Max limit of 4 same date entries are found in acceptances table and turnovers table',
            mysql_ERRNO = '45030';
    END IF;
END

注意:此存储过程仅用于创建接受预订。但是还有另一个存储过程是一样的,只是插入到了营业额表中。

这个存储过程是否足以确保即使在许多用户尝试创建预订时间表的竞争条件下,如果存在相同日期的条目,如果插入具有相同的日期,则会被拒绝。

或者我应该放弃这个并使用悲观锁定来确保这些表上的插入不会同时运行?

【问题讨论】:

【参考方案1】:

在每个SELECT 语句的末尾加上FOR UPDATE

还包括

START TRANSACTION;

COMMIT;

【讨论】:

以上是关于MySQL 存储过程插入验证的主要内容,如果未能解决你的问题,请参考以下文章

利用mysql存储过程循环插入新数据并更新

mysql 存储过程 若主键冲突则更新,不冲突则插入数据

mysql插入存储过程抛出错误

mysql存储过程怎样批量插入数据

MySQL存储过程从列表中插入多行

MySQL 存储过程参数验证