【问题标题】:MySQL - Constraint to Force New Record Field Value to be Greater than Previous Record Field ValueMySQL - 强制新记录字段值大于先前记录字段值的约束
【发布时间】:2017-03-06 21:49:24
【问题描述】:

我正在尝试创建一个数据库模式,强制特定表中的记录确认下面示例数据结构所表示的格式...

+--------------+--------+---------------+-----------------+
| EQUIPMENT_ID | CML_ID | INSPECTION_ID | INSPECTION_DATE |
+--------------+--------+---------------+-----------------+
| B1001-V001   |      1 |             1 | 2010-01-01      |
| B1001-V001   |      1 |             2 | 2011-01-01      |
| B1001-V001   |      1 |             3 | 2012-01-01      |
| B1001-V001   |      1 |             4 | 2013-01-01      |
| B1001-V001   |      1 |             5 | 2014-01-01      |
| B1001-V001   |      1 |             6 | 2015-01-01      |
| B1001-V001   |      1 |             7 | 2016-01-01      |
| B1001-V001   |      1 |             8 | 2017-01-01      |
| B1001-V001   |      1 |             9 | 2018-01-01      |
| B1001-V001   |      1 |            10 | 2019-01-01      |
| B1001-V001   |      2 |             1 | 2010-01-01      |
| B1001-V001   |      2 |             2 | 2011-01-01      |
| B1001-V001   |      2 |             3 | 2012-01-01      |
| B1001-V001   |      2 |             4 | 2013-01-01      |
| B1001-V001   |      2 |             5 | 2014-01-01      |
| B1001-V001   |      2 |             6 | 2015-01-01      |
| B1001-V001   |      2 |             7 | 2016-01-01      |
| B1001-V001   |      2 |             8 | 2017-01-01      |
| B1001-V001   |      2 |             9 | 2018-01-01      |
| B1001-V001   |      2 |            10 | 2019-01-01      |
+--------------+--------+---------------+-----------------+

基本上我想强制最大的 INSPECTION_ID (AUTO INCREMENTED) 对于 EQUIPMENT_ID 和 CML_ID 的特定组合始终具有最大的 INSPECTION_DATE(由用户手动输入)。

通俗地说,我想确保用户始终按时间顺序输入检查。

我可以采取某种规则、约束或架构设计来强制执行此操作吗?

【问题讨论】:

    标签: mysql sql schema


    【解决方案1】:

    MySQL 不强制执行约束,因此这些是否有效无关紧要。

    您需要使用触发器来强制执行此类条件。如果允许更新,则需要更新和插入触发器。

    insert 触发器看起来像这样:

    CREATE TRIGGER t_trigger_insert ON t BEFORE INSERT
    FOR EACH ROW
    BEGIN
        IF (EXISTS (SELECT 1
                    FROM t t2
                    WHERE t2.EQUIPMENT_ID = NEW.EQUIPMENT_ID AND
                          t2.INSPECTION_ID = NEW.INSPECTION_ID AND
                          t2.INSPECTION_DATE > NEW.INSPECTION_DATE
                   )
           ) THEN
            SIGNAL SQLSTATE '45000'
                SET MESSAGE_TEXT = 'A later date already exists';
        END IF;
    END;
    

    【讨论】:

    • 感谢戈登的快速回复。您有我可以用来执行此规则的触发器示例吗?
    猜你喜欢
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-20
    • 1970-01-01
    相关资源
    最近更新 更多