外键可以引用多个表吗?

问题描述

我有这三个表:

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) ); 约束确保在任何给定时间CHECKuser_id_auser_id_b中只有一列不为空。

此外,请注意user_id_c约束在MySQL中已从8.0.16版本开始进行验证。在该版本CHECK之前,约束已解析但未存储。