如何将外键引用到在某些列中具有特定值的主键?
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'));
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 中的 运行 示例。
假设我有一个站点用户 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'));
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 中的 运行 示例。