2017-09-14 132 views
0

我有一个数据库中的几个表,我想嘱咐了其中的一些稍微复杂的约束。SQL约束检查

问题主要涉及四个表:

  • A “主” 表,与可引用的主键id。两个中间表(我们称它们为“a”和“b”),每个表都有它们自己的id,并且每个都有一个参考列(作为foreign key)到main.id
  • “最终”的表,有自己的id,并与两列分别引用到ab

在“最终”表中,从“a”和“b”表引用的元素需要引用“main”中的相同条目。

表的简化定义:

CREATE TABLE `main_table` (
    `id` INT NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`id`) 
    -- other fields, indexes, etc 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
CREATE TABLE `table_a` (
    `id` INT NOT NULL AUTO_INCREMENT, 
    `main_ref` INT NOT NULL, 
    PRIMARY KEY (`id`), 
    INDEX `main` (`main_ref`), 
    FOREIGN KEY (`main_ref`) REFERENCES `main_table` (`id`) 
    -- other fields, indexes, etc 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
CREATE TABLE `table_b` (
    `id` INT NOT NULL AUTO_INCREMENT, 
    `main_ref` INT NOT NULL, 
    PRIMARY KEY (`id`), 
    INDEX `main` (`main_ref`), 
    FOREIGN KEY (`main_ref`) REFERENCES `main_table` (`id`) 
    -- other fields, indexes, etc 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
CREATE TABLE `final` (
    `id` INT NOT NULL AUTO_INCREMENT, 
    `ref_a` INT NOT NULL, 
    `ref_b` INT NOT NULL, 
    PRIMARY KEY (`id`), 
    INDEX `a` (`ref_a`), 
    FOREIGN KEY (`ref_a`) REFERENCES `table_a` (`id`), 
    INDEX `b` (`ref_b`), 
    FOREIGN KEY (`ref_b`) REFERENCES `table_b` (`id`) 
    -- other fields, indexes, etc 
    -- The `main_ref` value in the entries referenced by `ref_a` and `ref_b` should match!! 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

无论是用户界面和后端代码应该已经使无效的项目不可能发生的事情,但这个项目最终将包括连接到同一个数据库的其他应用程序,所以我我更喜欢数据库引擎尽可能多地处理数据完整性检查。

此外,值得一提的是,在目前的发展阶段,添加新列和/或索引是完全没有问题。

的信息是存在的,所有我缺少的是一种方法来告诉需要检查一下发动机。我怀疑生成的虚拟列和约束可能会有所帮助,但是在查看了几个源代码(包括MariaDB和MySQL文档以及一些网络搜索)之后,我无法找到实现它的方法。

我在Fedora 25(x86_64的弓)运行MariaDB的10.2.5。如果相关,后端代码使用Perl(v5.24.1)编写,并使用DBI模块连接到数据库。

回答

2

此(商业逻辑)不能在SCHEMA限制级别处理,但通过TRIGGERSSTORED PROCEDURES处理。

存储过程将验证(再次),并允许INSERT/UPDATE/DELETE

如果业务逻辑不遵循

触发器会作废。

个人口味,离开业务逻辑来显示和后端。在数据库中进行维护非常困难,容易出错并且不易变更。但我听说你有关外部应用程序,将 uck东西...因此提供一个API,而不是直接数据库操纵

+0

仍然必须决定采取哪种方法,但你的答案总结了我需要知道的一切SQL,所以我认为它很好。谢谢- –