Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Batasan Tabel Silang MySQL

Anda dapat menggunakan tabel "tipe":

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

dengan tepat 2 baris (sebanyak tabel subtipe berbeda yang Anda butuhkan:

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

Tabel supertype (yang mencakup kolom yang mereferensikan "Jenis"):

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)
  ) ;

Tabel subtipe (yang sekarang merujuk pada kombinasi kunci utama A dan kode_tipe:

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')
  ) ;

Di atas akan berfungsi dengan baik, jika saja MySQL telah mengimplementasikan CHECK kendala. Tapi belum. Jadi, untuk benar-benar yakin bahwa semua spesifikasi Anda diterapkan, dan bukan 'B' tipe data dimasukkan dalam C tabel, Anda harus menambahkan 2 tabel "ketik" lagi (dan menghapus yang tidak berguna di CHECK MySQL kendala):

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)
  ) ;

dengan masing-masing tepat 1 baris:

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

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

dan FK tambahan:

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

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

Dengan batasan ini, setiap baris tabel A, akan menjadi salah satu dari tipe B atau C dan akan berada di tabel masing-masing (B atau C) dan tidak pernah di keduanya.

Jika Anda juga ingin memastikan bahwa mereka akan berada tepat di satu tabel (dan tidak pernah di B atau C), itu harus diperhatikan saat menyisipkan di A (semua penyisipan harus dilakukan dengan transaksi yang memberlakukan persyaratan itu).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. pip install MySQL-python kembali tidak dapat menemukan vcvarsall.bat

  2. Apa tujuan menggunakan mysql_secure_installation?

  3. Bagaimana saya bisa mengelompokkan bidang menggunakan mysql?

  4. Bagaimana cara menghilangkan mode SQL STRICT di MySQL

  5. Simpan jalur file dalam Database