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

MySQLクロステーブル制約

    「タイプ」テーブルを使用できます:

    CREATE TABLE Type
      ( type_code CHAR(1) NOT NULL
      , PRIMARY KEY (type_code)
      ) ;
    

    正確に2行(必要な数の異なるサブタイプテーブル:

    INSERT INTO Type (type_code)
    VALUES ('B'), ('C') ;
    

    スーパータイプテーブル(「タイプ」を参照する列を含む):

    CREATE TABLE A
      ( a_id INT NOT NULL AUTO_INCREMENT
      , type_code CHAR(1) NOT NULL
      , PRIMARY KEY (a_id)
      , UNIQUE KEY (type_code, a_id)
      , FOREIGN KEY (type_code)
          REFERENCES Type (type_code)
      ) ;
    

    サブタイプテーブル(現在、Aの主キーとtype_codeの組み合わせを参照しています:

    CREATE TABLE B
      ( a_id INT NOT NULL
      , type_code CHAR(1) NOT NULL DEFAULT 'B'
      , PRIMARY KEY (type_code, a_id)
      , FOREIGN KEY (type_code, a_id)
          REFERENCES A (type_code, a_id)
      , CHECK (type_code = 'B')
      ) ;
    
    CREATE TABLE C
      ( a_id INT NOT NULL
      , type_code CHAR(1) NOT NULL DEFAULT 'C'
      , PRIMARY KEY (type_code, a_id)
      , FOREIGN KEY (type_code, a_id)
          REFERENCES A (type_code, a_id)
      , CHECK (type_code = 'C')
      ) ;
    

    MySQLのみがCHECKを実装していれば、上記は問題なく機能します。 制約。しかし、そうではありません。したがって、'B'ではなく、すべての仕様が適用されていることを絶対に確認してください タイプデータはCに挿入されます テーブルには、さらに2つの「タイプ」テーブルを追加する必要があります(そして、MySQL CHECKで役に立たないものを削除します 制約):

    CREATE TABLE TypeB
      ( type_code CHAR(1) NOT NULL
      , PRIMARY KEY (type_code)
      ) ;
    
    CREATE TABLE TypeC
      ( type_code CHAR(1) NOT NULL
      , PRIMARY KEY (type_code)
      ) ;
    

    それぞれ正確に1行:

    INSERT INTO TypeB (type_code)
    VALUES ('B') ;
    
    INSERT INTO TypeC (type_code)
    VALUES ('C') ;
    

    および追加のFK:

    ALTER TABLE B
      ADD FOREIGN KEY (type_code)
        REFERENCES TypeB (type_code) ;
    
    ALTER TABLE C
      ADD FOREIGN KEY (type_code)
        REFERENCES TypeC (type_code) ;
    

    これらの制約により、テーブルAのすべての行はタイプBまたはCのいずれかになり、それぞれのテーブル(BまたはC)に含まれ、両方に含まれることはありません。

    また、それらが正確に1つのテーブルに含まれるようにしたい場合(BにもCにも含まれないようにする場合)、Aに挿入するときに注意する必要があります(すべての挿入は、その要件を適用するトランザクションで実行する必要があります)。




    1. mysqliプリペアドステートメントに複数の行を挿入します

    2. ORA-00907:右括弧がありません

    3. mysqli_affected_rows()は-1を返しますが、クエリは機能します

    4. Oracle DB:最初のクエリが空の場合、2番目のクエリを返します