问题描述
假设我有一个站点用户表,并且他们有一个帐户类型(客户、主控等)。
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'));
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 上的运行示例。