sql >> データベース >  >> RDS >> Mysql

外部キーとしての複合主キーからの1つのキーのみ

    この回答は、「table3に外部キーを追加する」という質問に答えます。 "FK(外部キー)がtable3に追加されたことを意味します table4の複合PK(主キー)の列の1つを参照する 。標準SQLでは、FKはPKの適切な/小さいサブセットを参照できます。

    この他の回答 おそらく「table3に外部キーを追加する」 "FKがtable4に追加されたことを意味します table3を参照するPKの列の1つ 。テーブルに設定されたFK列は、その中のPKまたはUNIQUE宣言から独立しています。

    標準SQLでは、FKはPKの適切な/小さいサブセットを参照できます。

    参照される列リストは、PRIMARYKEYまたはUNIQUEとして宣言する必要があります。 (PRIMARYKEYはUNIQUENOT NULL制約を作成します。)(UNIQUEであるセットを含むNOT NULL列のセットは一意である必要がありますが、制約は明示的である必要があります。)

    残念ながら、MySQLでは、UNIQUEではない列リストを参照するFKを宣言できます。そのようなFKまたはNULL以外の列を参照するFK(標準SQLではOK)は適切に実装されておらず、ドキュメント自体はそれを行わないようにアドバイスしています:

    (ドキュメントでは実際には明確にされていないため、明確に定義された操作とは何かを熟考することができます。)

    1.8.2.3外部キーの違い>
    13.1.18テーブルの作成構文
    13.1.18.6FOREIGNの使用主な制約

    PSReリレーショナルvsSQL

    リレーショナルモデルでは、FKはCK(候補キー)を参照します。スーパーキーは、一意の列セットです。 CKは、小さいスーパーキーを含まないスーパーキーです。 1つのCKをPK(主キー)と呼ぶことができます。列セットの値を他の場所に表示する必要がある場合、IND(包含依存関係)があると言います。 FKはCKに対するINDです。 INDがスーパーキーに対するものである場合、それを「外部スーパーキー」と呼ぶことができます。

    SQL PK またはUNIQUE NOT NULL スーパーキーを宣言します。 SQL PKとして宣言された小さい列セットが含まれていない場合はCKです。 またはUNIQUE NOT NULL 。 SQL FK 外国のスーパーキーを宣言します。したがって、SQLPKは実際には リレーショナルPK(したがってCK)とUNIQUENOTNULLは実際には CK。これらの1つに対するSQLFKは実際には リレーショナルFK。



    1. SQLServerでの長年にわたる文字列の集約

    2. java.sql.DriverManager.getConnection(...)がハングしているのはなぜですか?

    3. Typeormはすべてのデータを返すわけではありません

    4. このクエリで完全な外部結合をエミュレートする方法は?