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

SQLで複合主キーを参照する方法

    SQL FK(FOREIGN KEY)制約を宣言して、列のリストのサブ行値が、SQL PK(PRIMARY KEY)またはUNIQUENOTNULLを形成する列のリストのサブ行値として常に他の場所に表示されるようにします。他の宣言によってまだ暗示されていない場合はいつでも宣言してください。宣言されたSQLPK(PRIMARY KEY)またはUNIQUENOTNULLの列リストを参照する必要があります。したがって、NOT NULLによってすでに暗示されていて、含まれているPKまたはUNIQUE NOT NULLが小さい場合でも、参照されるテーブルでそれを宣言する必要があります。

    したがって、SQL PKは、一意であるが小さい一意の列セットを含まないという関係的な意味でのPKである必要はありません。つまり、小さいスーパーキーを含まないスーパーキーである、つまり最小/還元不可能なスーパーキーである、つまりCK(候補キー)。

    ここで、buildingnoを置き換える必要があるかもしれません &roomno FKを1つずつ、(buildingno, roomno) Roomへ :

    CONSTRAINT SESSION_FK12
        FOREIGN KEY(BUILDINGNO,ROOMNO) REFERENCES ROOM(BUILDINGNO,ROOMNO)
    

    かもしれない あなたのテーブルの意味に適切である-実際にはあなたが与えていないので、私たちは知ることができず、推測することしかできません。例:buildingno また RoomでPKまたはUNIQUENOTNULLと宣言されます。これは、roomno IS NOT NULLの場合です。 実際には(buildingno, roomno)と一致し、それを意味します PKまたはUNIQUENOTNULLと宣言できます。おそらく、FKは正しい しかし、あなたのRoom 宣言は不十分です。

    列のリストのサブ行値が常に列のリストのサブ行値として他の場所に表示される場合、これはIND(包含依存)制約と呼ばれます。 SQLで非FKINDを宣言する方法はありません。トリガーによって強制する必要があります。そのまた デザインに必要なものかもしれません。

    FKをbuildingnoから守ることができます Buildingへ 、しかしそれは私が提案するFKとbuildingnoのFKによって暗示されています Room Buildingを参照する 。

    複合主キーの一部を参照する



    1. 一意のIDを生成する

    2. PostgreSQLでmax(order_field)+1の行をトランザクションで挿入する方法

    3. MacにSQLServerをインストールする方法

    4. mysqlの最初の10個の異なる行を選択します