外鍵引用主鍵的問題,該主鍵也是唯一鍵 (MariaDB) 的一部分
我使用 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 中我無法點擊其中的值
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