这是我的数据库结构。
这是我用来创建表格的脚本
use for_stkoverflow;
CREATE TABLE UserGroup (
groupid MEDIUMINT NOT NULL AUTO_INCREMENT,
groupname VARCHAR(100),
PRIMARY KEY (`groupid`)
);
CREATE TABLE User_det (
Usrid MEDIUMINT NOT NULL AUTO_INCREMENT,
usrname VARCHAR(255),
groupid MEDIUMINT,
PRIMARY KEY (`Usrid`),
Foreign Key (groupid)
references UserGroup (groupid)
);
CREATE TABLE Accounts (
acid MEDIUMINT NOT NULL AUTO_INCREMENT,
groupid MEDIUMINT,
acname VARCHAR(255),
PRIMARY KEY (`acid`),
Foreign Key (groupid)
references UserGroup (groupid)
);
create table Ledger (
ledgerid MEDIUMINT NOT NULL AUTO_INCREMENT,
ledgername VARCHAR(255),
acid mediumint,
Usrid mediumint,
PRIMARY KEY (ledgerid),
Foreign Key (acid)
references Accounts (acid),
Foreign Key (Usrid)
references User_det (Usrid)
);
我输入了以下数据
用户组
----------
- groupid groupname
--------------------
- 1 Group1
- 2 Group2
用户数据
--------
- Usrid usrname groupid
-----------------------
- 1 User1 1
- 2 User2 2
帐户
--------
- acid groupid acname
---------------------
- 1 1 ac1
- 2 2 ac2
分类帐
--------
-ledgerid ledgername acid Usrid
--------------------------------
- 1 ledger1 1 1
- 2 ledger2 2 2
- 3 ledger3 1 2
- 4 ledger4 2 1
SELECT t1.ledgerid, t1.ledgername,t2.acname,t3.usrname
FROM Ledger AS t1
INNER JOIN Accounts AS t2 ON t1.acid = t2.acid
Inner join User_det AS t3 ON t1.Usrid = t3.Usrid;
当前的表结构允许插入违反数据库完整性的数据。
The entry ledgerid 3 is invalid ---------------------------------- because acname ac1 belongs to group1 to which User2 is not part of. The entry ledgerid 4 is
invalid
因为 acname ac2 属于 group2 而 User1 不属于。
如何防止插入此类数据?
现在在应用程序中,我正在 BL 层中通过 PHP 执行此检查。
我可以在数据库级别强制执行此操作吗,因为我在不使用 PHP 前端的情况下也从后台进行了一些导入。
最佳答案
使用识别关系,类似于:
请注意用户组 PK 如何从这个“菱形”的顶部迁移到“两侧”并在“底部”合并。由于底部的一行仅包含一个标识顶部的字段,因此它不能与顶部的多行相关。
如果您需要将其他 key 用于其他目的和/或将上述 key 替换(即 UNIQUE 约束)...,您仍然可以保留其他 key ...
顺便说一句,更一致地使用命名 - 我建议始终使用单数和前缀 PK 字段以及未缩写的表名...
关于mysql - 如何从 Mysql 中的不相关表强制执行外键约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17254077/