您可以创建一个Favorite 表
并从另外四个表中添加FOREIGN KEY
看起来像:
CREATE TABLE User (`ID` int not null, `Name` varchar(5)) ;
INSERT INTO User (`ID`, `Name`)
VALUES (1, 'Jogn'), (2, 'Henry') ;
CREATE TABLE Food (`ID` int, `calories` int) ;
INSERT INTO Food (`ID`, `calories`)
VALUES (1, 123), (2, 456) ;
CREATE TABLE Cocktails (`ID` int, `Alcoholic` int) ;
INSERT INTO Cocktails (`ID`, `Alcoholic`)
VALUES (1, 30), (2, 40) ;
CREATE TABLE Sweets (`ID` int, `Name` varchar(5)) ;
INSERT INTO Sweets (`ID`, `Name`)
VALUES (1, 'candy'), (2, 'cake') ;
CREATE TABLE Favorite
(`ID` int
, `UserID` int not null
, `FoodID` int
, `CocktailsID` int
, `SweetsID` int
)
;
ALTER TABLE `User` ADD CONSTRAINT PK_User PRIMARY KEY (`ID`);
ALTER TABLE `Food` ADD CONSTRAINT PK_Food PRIMARY KEY (`ID`);
ALTER TABLE `Cocktails` ADD CONSTRAINT PK_Cocktails PRIMARY KEY (`ID`);
ALTER TABLE `Sweets` ADD CONSTRAINT PK_Sweets PRIMARY KEY (`ID`);
ALTER TABLE `Favorite` ADD CONSTRAINT FK_Favorite_User
FOREIGN KEY (`UserID`) REFERENCES `User`(`ID`);
ALTER TABLE `Favorite` ADD CONSTRAINT FK_Favorite_Food
FOREIGN KEY (`FoodID`) REFERENCES `Food`(`ID`);
ALTER TABLE `Favorite` ADD CONSTRAINT FK_Favorite_Cocktails
FOREIGN KEY (`CocktailsID`) REFERENCES `Cocktails`(`ID`);
ALTER TABLE `Favorite` ADD CONSTRAINT FK_Sweetss
FOREIGN KEY (`SweetsID`) REFERENCES `Sweets`(`ID`);
INSERT INTO Favorite
(`ID`, `UserID`, `FoodID`, `CocktailsID`, `SweetsID`)
VALUES
(1, 1, '1', NULL, NULL),
(2, 2, NULL, '2', NULL),
(3, 1, NULL, NULL, '1')
;
当我为 Sweets 插入不存在的值时
INSERT INTO Favorite
(`ID`, `UserID`, `FoodID`, `CocktailsID`, `SweetsID`)
VALUES
(3, 1, NULL, NULL, 4)
;
会抛出异常
Cannot add or update a child row: a foreign key constraint fails (`db_9_1a5d3f`.`favorite`, CONSTRAINT `FK_Sweetss` FOREIGN KEY (`SweetsID`) REFERENCES `sweets` (`ID`))
你可以通过这个 SQL 脚本查询它们(也许创建一个视图):
select
T1.ID FavoriteID,
T1.`UserID`,
case when T2.ID is not null then 'Food'
when T3.ID is not null then 'Cocktails'
when T4.ID is not null then 'Sweets'
end type,
COALESCE(T2.ID,T3.ID,T4.ID) ID
from Favorite T1
left join Food T2 on T1.`FoodID` = T2.`ID`
left join Cocktails T3 on T1.`CocktailsID` = T3.`ID`
left join Sweets T4 on T1.`SweetsID` = T4.`ID`
| FavoriteID | UserID | type | ID |
|------------|--------|-----------|----|
| 1 | 1 | Food | 1 |
| 2 | 2 | Cocktails | 2 |
| 3 | 1 | Sweets | 1 |
如果你想测试:SQL Fiddle Test Demo Link