mysql に 2 つのテーブルがあります。テーブル A には、何千もの証明書を持つ主キー CertID があります。また、キー UserID もあります。テーブル B には主キー UserID があります。テーブル B には、テーブル A にはない UserID があります。つまり、テーブル A には、テーブル B には表示されない UserID があります。ただし、テーブル B のすべての UserID は、テーブル A にあります。参照整合性は可能ですか? ここで参照整合性を強制するにはどうすればよいですか?
4 に答える
これは、tableAがtableBUserID
に依存していることを意味し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....
referential integrity
TableAのUserID列にアイテムがあり、TableBのUserID列には存在しないため、ここで強制することはできません。
join
ただし、参照整合性の制約がなくても、2つのテーブルから値を取得するために使用できます。
大まかに言えば、MySQLの参照整合性は、使用しているストレージエンジンによって決まります。
以前のストレージエンジンは参照整合性をまったくサポートしていませんでしたが、InnoDB(新規インストールのデフォルト)のような新しいストレージエンジンはそれをサポートしています。
ストレージエンジンをチェックして、参照整合性をサポートしているかどうかを確認します。InnoDBは良い叫びになるでしょう。(一度/場合)参照整合性をサポートするエンジンを使用している場合は、関係を定義するために外部キー制約を定義する必要があります。
便利な入門書はここにあります:-
http://blogs.sakienvirotech.com/index.php/random/2011/09/19/mysql-101-referential-integrity
参照整合性とは、基本的な外部キー以上のものを意味します。また、テーブル B で特定の UserID を持つ行が削除または変更された場合にどうなるかという質問も出されます。これはビジネス上の問題であり、変更をカスケードすることができます。カスケード削除とは、ユーザーを削除する場合、そのユーザーの証明書へのリンクを削除することを意味し、カスケード更新とは、テーブル B のユーザー ID を変更すると、テーブル A の対応する値も変更されることを意味します。NULL に設定すると、リンク レコードを保持したいが、テーブル A のユーザー ID を NULL に設定し、何もしないということは、テーブル A にその行への参照がある間、テーブル B の行を削除または更新できないことを意味します。
参照整合性は少し包括的な用語であり、すべてのコンテキストで同じ意味ではありません。特定のシステムまたは実装に関連する整合性のみを持ちます。