微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

外键可以引用多个表吗?

如何解决外键可以引用多个表吗?

我有这三个表:

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之前,约束已解析但未存储。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。