2

我正在尝试建立一个 MySQL 数据库。最终的数据库将包括大约。200 列分布在 7 个表中。现在我遇到了一个问题,我想为大多数列添加检查约束。一些列将只有一个约束,其他列将有许多和/或受不同表的列的影响。

例如,如果年龄超过 20 岁,或者如果邮政编码由 5 个字符组成并以 1 开头,或者如果入院日期(表格入院)早于出院日期(表格出院),则只能将行添加到表格中. 举三个例子。我能想出1000多个,这是我的问题。

我想以更结构化的方式添加这些约束。具有超过 10 个约束的触发器将很复杂,除了作者之外没有人能够重建所有约束。但是,如果数据库将使用多年,许多管理员将不得不使用数据库,并且可能会添加新的或删除不必要的约束。

DELIMITER $$
CREATE TRIGGER `test``_before_insert` BEFORE INSERT ON `zip`
FOR EACH ROW

BEGIN
    IF NEW.zip_id < 5 THEN
        SIGNAL SQLSTATE '12345'
        SET MESSAGE_TEXT = 'check constraint 1';
    END IF;

    IF NEW.zip_id = 5 THEN
        SIGNAL SQLSTATE '12345'
        SET MESSAGE_TEXT = 'check constraint 2';
    END IF;
END $$

DELIMITER ;

这就是我不想处理问题的方式。 

我的问题是,是否有一种方法可以以普通人类可读的方式声明约束(例如,每个文本文件都有一个好名称的约束)并将它们添加到数据库中。

4

2 回答 2

0

不幸的是,MySQL 中的检查约束不起作用。您可以在这个SO question了解更多信息。甚至这个问题的公认答案也建议使用触发器。

当您决定使用触发器时,您就走在了正确的轨道上。但是,您有一些误解。

触发器基本上是在表上的事件上定义的。由于您有 7 个表,因此每个表至少有 7 个单独的触发器。在MySQL 参考手册中阅读有关 MySQL 中触发器的更多信息。

只有你自己必须想办法让代码井井有条,这样你的队友甚至你也能很好地理解它。您需要做的就是遵循整个软件行业遵循的最佳实践。有关一些提示,您可以在 dba.stackexchange.com 上参考此处此处。

于 2013-04-12T15:01:05.990 回答
0

我已经考虑过我的问题,并且对触发器中的约束检查有另一个论点和解决方案。首先,论点:我可能至少需要一个 BEFORE INSERT 和一个 BEFORE UPDATE 触发器来检查我的数据。两个触发器或多或少相同。如果约束随时间发生变化,我必须将更改提交给两个触发器,否则我的数据可能会不一致。我想到了存储过程来实现一个约束,它可以在 INSERT 和 UPDATE 触发器中调用。现在,如果我更改一个程序,它会影响两个触发器。

DROP TRIGGER IF EXISTS test_before_insert;
DROP PROCEDURE IF EXISTS `procedureLess5`;
DROP PROCEDURE IF EXISTS `procedureEquals5`;

DELIMITER $$

CREATE PROCEDURE `procedureLess5` (IN myInput INT)
BEGIN
    IF myInput < 5 THEN
        SIGNAL SQLSTATE '12345'
        SET MESSAGE_TEXT = 'check constraint 1';
    END IF;
END $$

CREATE PROCEDURE `procedureEquals5` (IN myInput INT)
BEGIN
    IF myInput = 5 THEN
        SIGNAL SQLSTATE '12345'
        SET MESSAGE_TEXT = 'check constraint 2';
    END IF;
END $$

CREATE TRIGGER `test_before_insert` BEFORE INSERT ON `zip`
FOR EACH ROW
BEGIN
    CALL procedureLess5(NEW.zip_id);
    CALL procedureEquals5(NEW.zip_id);
END $$

DELIMITER ; 

这是一个机会吗?如果我有超过 20 个调用过程,我的数据库的性能如何?

还是你想别的办法?我不固定 MySQL,PostgreSQL 也是一个机会。在 PostgreSQL 中使用 CHECK CONSTRAINS 是否更好/更快/更标准?

于 2013-04-15T11:45:44.873 回答