我在mysql中有两个表。表A具有包含数千个证书的主键CertID。 它还有一个关键的UserID。表B具有主键UserID。 表B的UserID不在表A中。我的意思是表A中的UserID没有出现在表B中。但表B中的所有UserID都可以在表A中找到。 参考完整性是否可能? 我如何在这里强制执行参照完整性?
答案 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>
参照完整性是一个笼统的术语,并不代表在每种情况下都相同。它只具有与特定系统或实现相关的完整性。