PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Ograniczenia klucza obcego w relacjach wiele-do-wielu

To błaga o kłopoty. Nadal będziesz napotykać drobne niezgodności. Lub nawet nie zauważaj ich dużo później, kiedy szkoda zostanie wyrządzona. Nie rób tego. Używaj również PostgreSQL lokalnie. Jest dostępny bezpłatnie dla większości systemów operacyjnych. Dla kogoś zaangażowanego w „projekt kursu z bazami danych” jest to zaskakujące szaleństwo. Powiązane:

Inne porady:

Wszystko razem, może wyglądać tak:

CREATE TABLE IF NOT EXISTS post (
   post_id   serial PRIMARY KEY
 , author_id integer
 , title     text
 , content   text
 , image_url text
 , date      timestamp
);

CREATE TABLE IF NOT EXISTS label (
   label_id  serial PRIMARY KEY
 , name      text UNIQUE
);

CREATE TABLE IF NOT EXISTS label_post(
    post_id  integer REFERENCES post(post_id) ON UPDATE CASCADE ON DELETE CASCADE
  , label_id integer REFERENCES label(label_id) ON UPDATE CASCADE ON DELETE CASCADE
  , PRIMARY KEY (post_id, label_id)
);

Wyzwalacz

Aby usunąć nieużywane etykiety, zaimplementuj wyzwalacz . Dostarczam inną wersję, ponieważ nie jestem zadowolony z tej dostarczonej przez @Priidu :

CREATE OR REPLACE FUNCTION f_trg_kill_orphaned_label() 
  RETURNS trigger
  LANGUAGE plpgsql AS
$func$
BEGIN
   DELETE FROM label l
   WHERE  l.label_id = OLD.label_id
   AND    NOT EXISTS (
      SELECT 1 FROM label_post lp
      WHERE  lp.label_id = OLD.label_id
      );
END
$func$;
  • funkcja wyzwalacza należy utworzyć przed wyzwalacz .

  • Proste DELETE polecenie może wykonać zadanie. Nie potrzeba drugiego zapytania - w szczególności nie ma count(*) . EXISTS jest tańszy.

  • Pojedyncze cudzysłowy wokół nazwy języka są tolerowane, ale tak naprawdę jest to identyfikator, więc po prostu pomiń nonsens:LANGUAGE plpgsql

CREATE TRIGGER label_post_delaft_kill_orphaned_label
AFTER DELETE ON label_post
FOR EACH ROW EXECUTE PROCEDURE f_trg_kill_orphaned_label();

Nie ma CREATE OR REPLACE TRIGGER w PostgreSQL. Po prostu CREATE TRIGGER .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy dobrym pomysłem jest przechowywanie tablicy jako wartości pola lub przechowywanie wartości tablicy jako rekordów?

  2. TypeORM warunkowy dopuszczający wartość null?

  3. Konwersja Oracle SQL Select do PostgreSQL select

  4. Śledzenie wysokiej dostępności PostgreSQL za pomocą funkcji Heartbeat

  5. Jak znaleźć wszystkie kombinacje (podzbiór) dowolnej wielkości tablicy w postgresql