mysql - 如何从 Mysql 中的不相关表强制执行外键约束?

标签 mysql database-design foreign-key-relationship data-integrity

这是我的数据库结构。 enter image description here

这是我用来创建表格的脚本

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)
);

我输入了以下数据

enter image description here

用户组

----------
- 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 前端的情况下也从后台进行了一些导入。

最佳答案

使用识别关系,类似于:

enter image description here

请注意用户组 PK 如何从这个“菱形”的顶部迁移到“两侧”并在“底部”合并。由于底部的一行仅包含一个标识顶部的字段,因此它不能与顶部的多行相关。

如果您需要将其他 key 用于其他目的和/或将上述 key 替换(即 UNIQUE 约束)...,您仍然可以保留其他 key ...


顺便说一句,更一致地使用命名 - 我建议始终使用单数和前缀 PK 字段以及未缩写的表名...

关于mysql - 如何从 Mysql 中的不相关表强制执行外键约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17254077/

相关文章:

php - 嵌套集模型是否适用于具有多个类别(多对多)的文章?

数据库:关系型/非关系型/面向对象...选择什么?

MySQL 相互依赖表

mysql - 在 char 数据类型的字段中插入中文和日文字符

javascript - 仅当数组元素尚不存在时,如何将其插入数据库

mysql - 结合图形数据库和 RDBMS

java - 使用数据表与单独的审计表进行审计

Mysql外键必须引用父表的整个主键?

mysql - 一张表用于多个 hasman 关系

python - Scrapy 与 Mysql 出现此错误