sql >> Database >  >> RDS >> Mysql

MySQL Cross Table-beperking

U kunt een "type"-tabel gebruiken:

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

met precies 2 rijen (zoveel als de verschillende subtypetabellen die je nodig hebt:

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

De supertypetabel (die een kolom bevat die verwijst naar "Type"):

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

De subtypetabellen (die nu verwijzen naar de combinatie van A's primaire sleutel en 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')
  ) ;

Het bovenstaande zou prima werken, als MySQL maar CHECK had geïmplementeerd beperkingen. Maar dat heeft het niet. Dus om er absoluut zeker van te zijn dat al uw specificaties worden nageleefd, en niet 'B' type gegevens worden ingevoegd in C tabel, moet u nog 2 "type" tabellen toevoegen (en de nutteloze verwijderen in MySQL CHECK beperkingen):

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

met elk precies 1 rij:

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

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

en de extra FK's:

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

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

Met deze beperkingen zal elke rij van tabel A van het type B of C zijn en in de respectievelijke tabel (B of C) en nooit in beide.

Als u er ook zeker van wilt zijn dat ze in precies één tabel staan ​​(en nooit in B noch C), moet u voorzichtig zijn bij het invoegen in A (alle invoegingen moeten worden gedaan met een transactie die die vereiste afdwingt).




  1. Werkmap gebruiken voor bronbeheerdatabase

  2. mysqli_connect met externe server

  3. hoe Telugu-tekens in de Indiase taal in te voegen in mysql

  4. Converteer speciale string naar datum in H2