sql >> Database teknologi >  >> RDS >> PostgreSQL

Skal jeg tilføje en type kolonne for at designe arv i postgreSQL?

Sikker på, at du kan gøre dette for eksempel for at håndhæve, at kun én undertabel kan referere til en given række:

CREATE TABLE Super_Table (
  super_id SERIAL PRIMARY KEY,
  sub_type CHAR(1) NOT NULL,
  UNIQUE KEY (super_id, sub_type) 
);

CREATE TABLE Sub_Table_A (
  super_id PRIMARY KEY,
  sub_type CHAR(1) NOT NULL,
  CHECK (sub_type = 'A'),
  FOREIGN KEY (super_id, sub_type) REFERENCES Super_Table (super_id, sub_type)
);

CREATE TABLE Sub_Table_B (
  super_id PRIMARY KEY,
  sub_type CHAR(1) NOT NULL,
  CHECK (sub_type = 'B'),
  FOREIGN KEY (super_id, sub_type) REFERENCES Super_Table (super_id, sub_type)
);

Nu er der ingen måde, der kan refereres til en række i Super_Table af en række i begge undertabeller. Rækken i Super_Table skal have enten 'A' eller 'B', så kun én af undertabellerne kan opfylde fremmednøglereferencen.

Om din kommentar:

Min forståelse er, at den nuværende PostgreSQL-implementering af INHERITS tillader en række anomalier relateret til indekser, unikke begrænsninger og udenlandske nøglebegrænsninger. Brugen af ​​denne funktion er vanskelig og udsat for fejl.

Grundlæggende, fordi indekser kun eksisterer over en enkelt tabel, hvis du har en unik begrænsning på din overordnede tabel, hvordan kan den så håndhæve denne unikhed over forælderen og alle dens børn? Børnene kunne indsætte værdier i deres tabeller, som allerede findes i det overordnede, eller det forælder kan indsætte en værdi, der allerede findes i et af børnene.

Ligeledes kan fremmednøgler ikke referere til den overordnede tabel og/eller dens børn, fordi det er tvetydigt, hvilken række der refereres til, hvis der kan eksistere flere rækker i overordnet/underordnet med den samme primære nøgle eller unikke værdi.

Disse er kendte og uløste begrænsninger af INHERITS i PostgreSQL. Det design, jeg viste ovenfor, løser problemet for primær nøgle, men ikke for sekundære unikke nøgler.

http://archives.postgresql.org/pgsql-hackers/2010 -05/msg00285.php




  1. hvordan man bruger Fuzzy look up til at finde sætningen i SQL?

  2. kan ikke indlæse for stor html-fil, når du tager fat

  3. Sådan sender du inputparameter i lagret procedurekald fra en enkelt kommandolinje

  4. Trækker NHL-stilling fra XML-tabellen med PHP