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

Ограничения на външен ключ в отношенията много към много

Това е молба за неприятности. Ще продължите да се натъквате на дребни несъвместимости. Или дори не ги забелязвайте до много по-късно, когато щетите са нанесени. Не го правете. Използвайте и PostgreSQL локално. Той е свободно достъпен за почти всяка ОС. За някой, участващ в "курсов проект за бази данни", това е изненадваща глупост. Свързани:

Други съвети:

Всичко взето заедно може да изглежда така:

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

Задействане

За да изтриете неизползваните етикети, приложете тригер . Предоставям друга версия, тъй като не съм доволен от тази, предоставена от @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$;
  • Задействащата функция трябва да се създаде преди спусъка .

  • Просто DELETE команда може да свърши работа. Не е необходима втора заявка - по-специално не count(*) . EXISTS е по-евтино.

  • Единичните кавички около името на езика се толерират, но това наистина е идентификатор, така че просто пропуснете глупостите: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();

Няма CREATE OR REPLACE TRIGGER в PostgreSQL, все още. Просто 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. Часова разлика в рамките на работното време

  2. правилен начин за стартиране/спиране на база данни на postgres pg_ctl или услуга postgres

  3. psycopg2 - Връзка без ключ

  4. Грешка в инструментите на Eclipse/Hibernate:Записът в класовата пътека на архива не съществува

  5. уникално ограничение за типа данни Bytea на Postgresql