sql >> Databáze >  >> RDS >> PostgreSQL

Cizí klíčová omezení ve vztazích many-to-many

To si koleduje o potíže. Stále budete narážet na drobné nekompatibility. Nebo si jich ani nevšimnou až mnohem později, až dojde k poškození. Nedělejte to. Používejte PostgreSQL také lokálně. Je volně dostupný pro většinu všech OS. Pro někoho, kdo je zapojen do „projektu databázového kurzu“, je to překvapivá hloupost. Související:

Další rada:

Všechno dohromady by mohlo vypadat takto:

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

Spouštěč

Chcete-li smazat nepoužívané štítky, implementujte spouštěč . Dodávám jinou verzi, protože nejsem spokojený s ta, kterou poskytuje @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$;
  • Spouštěcí funkce musí být vytvořen před spouštěč .

  • Jednoduché DELETE příkaz může dělat práci. Není potřeba žádný další dotaz – zejména žádný count(*) . EXISTS je levnější.

  • Jednoduché uvozovky kolem názvu jazyka jsou tolerovány, ale ve skutečnosti se jedná o identifikátor, takže vynechejte nesmysly: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();

Neexistuje žádný CREATE OR REPLACE TRIGGER zatím v PostgreSQL. Stačí CREATE TRIGGER .



  1. ORA-28000:Účet je uzamčen a dochází k časté chybě

  2. Oracle SQL porovnává záznamy v tabulce

  3. vložit data z jedné tabulky do druhé v mysql

  4. Srovnání fulltextového vyhledávače - Lucene, Sphinx, Postgresql, MySQL?