sql >> Databasteknik >  >> RDS >> Mysql

MySQL - Villkorliga utländska nyckelbegränsningar

Du försöker göra en design som kallas Polymorfa associationer . Det vill säga, den främmande nyckeln kan referera till rader i vilken som helst av flera relaterade tabeller.

Men en främmande nyckel-begränsning måste referera till exakt en tabell. Du kan inte deklarera en främmande nyckel som refererar till olika tabeller beroende på värdet i en annan kolumn i dina Comments tabell. Detta skulle bryta mot flera regler för relationsdatabasdesign.

En bättre lösning är att göra en sorts "supertable" som refereras av kommentarerna.

CREATE TABLE Commentable (
  id SERIAL PRIMARY KEY
);

CREATE TABLE Comments (
  comment_id SERIAL PRIMARY KEY,
  foreign_id INT NOT NULL,
  ...
  FOREIGN KEY (foreign_id) REFERENCES Commentable(id)
);

Var och en av dina innehållstyper skulle betraktas som en undertyp av denna supertabell. Detta är analogt med det objektorienterade konceptet med ett gränssnitt .

CREATE TABLE BlogPosts (
  blogpost_id INT PRIMARY KEY, -- notice this is not auto-generated
  ...
  FOREIGN KEY (blogpost_id) REFERENCES Commentable(id)
);

CREATE TABLE UserPictures (
  userpicture_id INT PRIMARY KEY, -- notice this is not auto-generated
  ...
  FOREIGN KEY (userpicture_id) REFERENCES Commentable(id)
);

Innan du kan infoga en rad i BlogPosts eller UserPictures , måste du infoga en ny rad till Commentable för att generera ett nytt pseudonyckel-id. Sedan kan du använda det genererade ID:t när du infogar innehållet i respektive undertypstabell.

När du väl har gjort allt det kan du lita på referensintegritetsbegränsningar.



  1. Postgresql COPY-kommandot som ger Behörighet nekad fel

  2. Hur man skapar användare i PostgreSQL

  3. Uppnå MySQL Failover &Failback på Google Cloud Platform (GCP)

  4. Hur man övervinner oavsiktlig radering av data i MySQL &MariaDB