我有一個數據庫中的幾個表,我想囑咐了其中的一些稍微複雜的約束。SQL約束檢查
問題主要涉及四個表:
- A 「主」 表,與可引用的主鍵
id
。兩個中間表(我們稱它們爲「a」和「b」),每個表都有它們自己的id
,並且每個都有一個參考列(作爲foreign key
)到main.id
。 - 「最終」的表,有自己的
id
,並與兩列分別引用到a
和b
。
在「最終」表中,從「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
模塊連接到數據庫。
仍然必須決定採取哪種方法,但你的答案總結了我需要知道的一切SQL,所以我認爲它很好。謝謝- –