0

我在mysql中有两个表。表 A 具有包含数千个证书的主键 CertID。它还有一个关键的 UserID。表 B 具有主键 UserID。表 B 的用户 ID 不在表 A 中。我的意思是我们在表 A 中的用户 ID 没有出现在表 B 中。但是表 B 中的所有用户 ID 都可以在表 A 中找到。参照完整性可能吗?如何在此处强制执行参照完整性?

4

4 回答 4

0

这只是意味着 tableA'sUserID依赖于 tableB's UserID。但是tableB不依赖于tableA。架构看起来像这样,

CREATE TABLEB
(
    UserID INT,
    ......,
    CONSTRAINT tb_pk PRIMARY KEY (USERID)
);

CREATE TABLEA
(
    CertID INT,
    UserID INT,
    .....,
     CONSTRAINT tb_pk1 PRIMARY KEY (CertID),
     CONSTRAINT tb_fk FOREIGN KEY (UserID) REFERENCES tableB(UserID)
);

您可以在 tableB 上插入任何记录。但是在 tableA 上,如果您尝试插入记录,请确保 userID 的值必须首先存在于 tableB 上UserID,否则您将收到错误

ERROR 1452 (23000): cannot add or update a child row....
于 2012-10-26T08:35:28.077 回答
0

您不能 referential integrity 在此处强制执行,因为 TableA 在 UserID 列中有项目,而在 TableB 的 UserID 列中不存在,

但是 join 即使没有任何参照完整性约束,您也可以使用从两个表中获取值。

于 2012-10-26T08:37:12.627 回答
0

在高层次上,MySQL 中的引用完整性由您使用的存储引擎控制。

早期的存储引擎根本不支持引用完整性,但是像 InnoDB 这样的新存储引擎(我相信新安装的默认值)确实支持它。

检查您的存储引擎,看看它是否甚至支持引用完整性。InnoDB 将是一个不错的选择。(一旦/如果)您正在使用支持引用完整性的引擎,您需要定义外键约束来定义关系。

可以在这里找到有用的入门:-

http://blogs.sakienvirotech.com/index.php/random/2011/09/19/mysql-101-referential-integrity

于 2012-10-26T08:37:15.840 回答
0

参照完整性不仅仅意味着基本的外键。它还提出了一个问题,如果在表 B 中删除或更改具有特定 UserID 的行会发生什么情况。这是一个业务问题,您可以级联更改。级联删除表示如果删除用户,则要删除该用户到证书的链接,级联更新意味着更改表 B 中的 userID 也会更改表 A 中的相应值。设置为 NULL 表示如果删除用户,您想保留他们的链接记录,但将表 A 中的用户 ID 设置为 NULL 并且什么都不做意味着您将不允许删除或更新表 B 中的行,而表 A 中有对它的引用。

参照完整性是一个笼统的术语,并不意味着在每种情况下都相同。它仅具有与特定系统或实现相关的完整性。

于 2012-10-26T08:41:33.553 回答