Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL Cross Table Constraint

Можете да използвате таблица "тип":

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) и никога в двете.

Ако искате също така да сте сигурни, че те ще бъдат в точно една таблица (и никога нито в B, нито в C), трябва да внимавате, когато вмъквате в A (всички вмъквания трябва да се извършват с транзакция, която налага това изискване).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да вмъкна специални символи в база данни?

  2. Как да променя съпоставянето на всички редове от latin1_swedish_ci на utf8_unicode_ci?

  3. Неуспешно колело за изграждане на mysql-python

  4. Получаването на предоставен аргумент не е валиден MySQL резултатен ресурс при извикване на mysql_fetch_array()

  5. MySQL неизвестна грешка в колоната при използване на ALTER, не разбирам поведението