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:
-
Jak @Priidu zmínil v komentářích , vaše omezení cizího klíče jsou obrácená. To není k debatě, jsou prostě špatně .
-
V PostgreSQL použijte
serial
neboIDENTITY
(Postgres 10+) místo SQLiteAUTOINCREMENT
. Viz: -
Použijte
timestamp
(nebotimestamptz
) místodatetime
. -
Nepoužívejte smíšené identifikátory velkých a malých písmen.
-
Nepoužívejte nepopisné názvy sloupců jako
id
. Vůbec. To je anti-vzor zavedený polodůvtipným middlewarem a ORM. Když spojíte několik tabulek, skončíte s několika sloupci s názvemid
. To je aktivně škodlivé. -
Existuje mnoho stylů pojmenování, ale většina se shoduje na tom, že jako názvy tabulek je lepší mít výrazy v jednotném čísle. Je kratší a minimálně stejně intuitivní/logický.
label
, nikolilabels
.
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
.