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

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

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

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

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 上的运行示例。

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