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

问题描述

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

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));

并且有一个描述masters的表,其中的标识符仅指users表中属于master类型的标识符。

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

我该怎么做,有可能吗?

解决方法

在 MySQL 8+ 中,您还可以将用户类型添加到引用表并使其成为外键的一部分。通过检查约束,您可以确保类型始终为 '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,'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','administrator') not null,constraint pk_userId primary key (userId),constraint uq1 unique (userId,userType)
);

create table masters (
  masterId int not null,serviceId int,'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,'master'); -- succeeds

但如果你尝试:

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

违反了检查约束“masters_chk_1”。

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