Mariadb

外鍵引用主鍵的問題,該主鍵也是唯一鍵 (MariaDB) 的一部分

  • January 21, 2021

我使用 MariaDb 創建了一個數據庫。我有下author表(id作為主鍵),它由另外兩個表擴展, author_personal並且author_corporate代表兩種不同的作者並具有不同的欄位:

CREATE TABLE `author` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `author_type` char(1) NOT NULL,
 -- other fields
 PRIMARY KEY (`id`),
 UNIQUE KEY `author_UN` (`id`,`author_type`) USING BTREE,
 CONSTRAINT `author_CHECK_type` CHECK (`author_type` in ('P','C'))
);

CREATE TABLE `author_personal` (
 `id` int(10) unsigned NOT NULL,
 `surname` varchar(30) DEFAULT NULL,
 `name` varchar(30) DEFAULT NULL,
 -- other fields
 `author_type` char(1) GENERATED ALWAYS AS ('P') VIRTUAL,
 PRIMARY KEY (`id`),
 KEY `author_personal_FK` (`id`,`author_type`),
 CONSTRAINT `author_personal_FK` FOREIGN KEY (`id`, `author_type`) REFERENCES `author` (`id`, `author_type`) ON DELETE CASCADE
);

CREATE TABLE `author_corporate` (
 `id` int(10) unsigned NOT NULL,
 `corporate_name` varchar(50) DEFAULT NULL,
 `corporate_acronym` varchar(5) DEFAULT NULL,
 `author_type` char(1) GENERATED ALWAYS AS ('C') VIRTUAL,
 PRIMARY KEY (`id`),
 KEY `author_corporate_FK` (`id`,`author_type`),
 CONSTRAINT `author_corporate_FK` FOREIGN KEY (`id`, `author_type`) REFERENCES `author` (`id`, `author_type`) ON DELETE CASCADE
);

雖然author.id已經足夠了,但我決定創建一個 UNIQUE KEY ( id, ) 以供另外兩個表中的外author_type鍵引用,這樣就不可能從未標​​記為 P 的表和從表中引用未標記為 C。author_personal``author``author_corporate``author

當我想author使用主鍵引用時,問題就出現了,如下表所示:

CREATE TABLE `work_authors` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `work_id` int(10) unsigned NOT NULL,
 `author_id` int(10) unsigned NOT NULL,
 -- other fields
 PRIMARY KEY (`id`),
 KEY `work_authors_FK` (`work_id`),
 KEY `work_authors_FK_author` (`author_id`) USING BTREE,
 CONSTRAINT `work_authors_FK` FOREIGN KEY (`work_id`) REFERENCES `work` (`id`) ON UPDATE CASCADE,
 CONSTRAINT `work_authors_FK_author` FOREIGN KEY (`author_id`) REFERENCES `author` (`id`) ON UPDATE CASCADE
);
   

DBeaver 和 PhpMyAdmin 都認為work_authors_FK_author引用author_UN而不是實際的主鍵 ( author.id)。

DBeaver 外鍵說明

這意味著在 DBeaver 中我無法點擊其中的值work_authors.author_id並打開引用的記錄,authors因為我收到以下錯誤:

Entity [davide_library.author] association [work_authors_FK_author] columns differs from referenced constraint [author_UN] (1<>2)

我使用 DBeaver 創建了外鍵。雖然我選擇PRIMARY了唯一鍵,但在外鍵列表中它始終顯示author_UN為引用的對象。我不知道這種行為是否取決於 MariaDB 或 DBeaver。

我的問題是:

有沒有辦法在 DDL 中明確引用主鍵而不是唯一鍵?

或者,或者:

除了 UNUQUE 約束之外,是否有其他方法可以檢查author_personal僅引用標記為 P 的作者,以及相同的方法author_corporate

MariadDB 似乎可以正確處理它。根據Fiddle,information_schema 是正確的,所以問題似乎出在您的工具上:

SELECT table_name, constraint_name, referenced_table_name, unique_constraint_name 
FROM information_schema.referential_constraints;

table_name          constraint_name         referenced_table_name   unique_constraint_name
-----------------------------------------------------------------------------
author_personal1    author_personal_FK      author1                 author_UN
work_authors1       work_authors_FK_author  author1                 PRIMARY

引用自:https://dba.stackexchange.com/questions/283663