2017-09-14 166 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,所以我認爲它很好。謝謝- –