参照完整性SQL

时间:2012-10-26 08:30:17

标签: mysql database phpmyadmin

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

4 个答案:

答案 0 :(得分:0)

这只意味着tableA的UserID依赖于tableB的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....

答案 1 :(得分:0)

您无法在此处强制执行 referential integrity ,因为TableA在UserID列中具有项目,该项目不在TableB的UserID列中,

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

答案 2 :(得分:0)

在较高的层面上,MySQL中的参照完整性取决于您使用的存储引擎。

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

检查您的存储引擎,看它是否支持参照完整性。 InnoDB将是一个很好的呼喊。 (一旦/如果)您正在使用支持参照完整性的引擎,您需要定义外键约束来定义关系。

有用的底漆可以在这里找到: -

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

答案 3 :(得分:0)

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

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