问题描述
我有这三个表:
CREATE TABLE userTypeA
(
id VARCHAR (256) PRIMARY KEY,nickname VARCHAR (256) NOT NULL,password VARCHAR(70) NOT NULL DEFAULT '123456'
--AND MORE OTHER ATTRIBUTTES DIFFERENT FROM OTHER USERTYPES
);
CREATE TABLE userTypeB
(
id VARCHAR (256) PRIMARY KEY,password VARCHAR(70) NOT NULL DEFAULT '123456'
--AND MORE OTHER ATTRIBUTTES DIFFERENT FROM OTHER USERTYPES
);
CREATE TABLE userTypeC
(
id VARCHAR (256) PRIMARY KEY,password VARCHAR(70) NOT NULL DEFAULT '123456'
--AND MORE OTHER ATTRIBUTTES DIFFERENT FROM OTHER USERTYPES
);
现在,我的想法是创建一个具有外键的表,该表可以引用三个表(userTypeA,userTypeB,userTypeC)之一的ID。在某些情况下,它将引用表userTypeA,在其他情况下,它将引用表userTypeB,在其他情况下,它将引用表userTypeC。我试过了,但是似乎失败了:
CREATE TABLE account
(
account_id VARCHAR (256),user_id VARCHAR (256),PRIMARY KEY (account_id),CONSTRAINT accounts_users_fk1 FOREIGN KEY (user_id) REFERENCES userTypeA (id),CONSTRAINT accounts_users_fk2 FOREIGN KEY (user_id) REFERENCES userTypeB (id),CONSTRAINT accounts_users_fk3 FOREIGN KEY (user_id) REFERENCES userTypeC (id),);
我一直在寻找一些例子,但没有一个看起来像我的。您知道有什么方法可以用一个外键引用三个表之一吗?还是我应该创建不同的表并以不同的方式构造它们?
解决方法
您可以创建三个单独的列,每个列都有一个附带的外键,如:
Started POST "//api//users" for 127.0.0.1 at 2020-11-02 19:02:17 -0500
(1.3ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
NameError - uninitialized constant DeviseController:
app/controllers/api/registrations_controller.rb:3:in `<main>'
CREATE TABLE account (
account_id VARCHAR (256),user_id_a VARCHAR (256),user_id_b VARCHAR (256),user_id_c VARCHAR (256),PRIMARY KEY (account_id),CONSTRAINT accounts_users_fk1 FOREIGN KEY (user_id_a) REFERENCES userTypeA (id),CONSTRAINT accounts_users_fk2 FOREIGN KEY (user_id_b) REFERENCES userTypeB (id),CONSTRAINT accounts_users_fk3 FOREIGN KEY (user_id_c) REFERENCES userTypeC (id),CONSTRAINT chk1 CHECK (
user_id_a IS NOT NULL AND user_id_b IS NULL AND user_id_c IS NULL OR
user_id_a IS NULL AND user_id_b IS NOT NULL AND user_id_c IS NULL OR
user_id_a IS NULL AND user_id_b IS NULL AND user_id_c IS NOT NULL)
);
约束确保在任何给定时间CHECK
,user_id_a
和user_id_b
中只有一列不为空。
此外,请注意user_id_c
约束在MySQL中已从8.0.16版本开始进行验证。在该版本CHECK
之前,约束已解析但未存储。