这是我的数据库结构。
这是我用来创建表格的脚本
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
User_det
--------
- 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;
当前的表结构允许插入违反数据库完整性的数据。
条目 ledgerid 3 无效 ---------------------------------- 因为 acname ac1 属于 User2 所属的 group1不属于。条目分类帐 4 是
无效的
因为 acname ac2 属于 user1 不属于的 group2。
如何防止插入此类数据?
现在在应用程序中,我正在通过 BL 层中的 PHP 进行此检查。
我可以在数据库级别强制执行此操作吗,因为我在不使用 PHP 前端的情况下也从后端进行了一些导入。