如何将外键引用到在某些列中具有特定值的主键?

How to refer with a Foreign Key to a Primary key that has a specific value in some columns?

假设我有一个站点用户 table 并且他们有一个帐户类型(客户、主帐户等)。

Create table user_info(
userId int not null,
userPassword varchar(60),
userEmail varchar(30),
userLogin varchar(25),
userType enum ('client','master','administrator'),
Constraint Pk_userId Primary Key(userId));

还有一个table描述master,其中identifier只指用户table中属于master类型的那些identifier。

Create table masters(
masterId int not null,
serviceId int,
Constraint Fk_masterId Foreign Key(masterId)references user_info(userId));

我该怎么做,这可能吗?

在 MySQL 8+ 中,您还可以将用户类型添加到引用 table 并使其成为外键的一部分。使用检查约束,您可以确保类型始终为 'master'.

CREATE TABLE user_info
       (userid integer,
        usertype enum('client',
                      'master',
                      'administrator'),
        PRIMARY KEY (userid),
        UNIQUE (userid,
                usertype));

CREATE TABLE masters
             (masterid integer,
              userid integer,
              usertype enum('client',
                            'master',
                            'administrator')
                       NOT NULL
                       DEFAULT 'master',
              FOREIGN KEY (userid,
                           usertype)
                          REFERENCES user_info
                                     (userid,
                                      usertype),
              CHECK (usertype = 'master'));

db<>fiddle

8 之前的版本不强制检查约束。您可以在那里编写一个触发器来进行检查。

您可以在 MySQL 8.0.16 中使用复合键和 CHECK 约束来执行此操作。

例如:

create table user_info (
  userId int not null,
  userPassword varchar(60),
  userEmail varchar(30),
  userLogin varchar(25),
  userType enum ('client','master','administrator') not null,
  constraint pk_userId primary key (userId),
  constraint uq1 unique (userId, userType)
);

create table masters (
  masterId int not null,
  serviceId int,
  userType enum ('client','master','administrator') not null 
    check (userType = 'master'),
  constraint fk_master foreign key (masterId, userType)
    references user_info (userId, userType)
);

现在,让我们插入一些数据:

insert into user_info (userId, userType) values (123, 'master');

insert into masters (masterId, userType) values (123, 'master'); -- succeeds

但如果你尝试:

insert into masters (masterId, userType) values (123, 'client'); -- fails

Check constraint 'masters_chk_1' is violated.

请参阅 db<>fiddle 中的 运行 示例。