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

PostgreSQL 12:Cizí klíče a dělené tabulky

Nyní, když je PostgreSQL 12 venku, považujeme cizí klíče za plně kompatibilní s dělenými tabulkami. Můžete mít rozdělenou tabulku na obou stranách omezení cizího klíče a vše bude fungovat správně.

Proč na to upozorňuji? Dva důvody:za prvé, když byly rozdělené tabulky poprvé představeny v PostgreSQL 10, vůbec nepodporovaly cizí klíče; nemohli jste vytvořit FK na dělených tabulkách ani vytvořit FK, které odkazovaly na dělenou tabulku. Za druhé, protože funkce dědičnosti tabulky (v prvních dnech) ve skutečnosti také nepodporovala cizí klíče. To vše znamená, žev PostgreSQL je poprvé možné udržovat velké objemy dat při zachování referenční integrity. Nyní, když je tato funkce dokončena, jsou pro PostgreSQL otevřeny některé nové případy použití, které dříve nebyly.

Zde je docela triviální příklad.

CREATE TABLE items (
    item_id integer PRIMARY KEY,
    description text NOT NULL
) PARTITION BY hash (item_id);
CREATE TABLE items_0 PARTITION OF items FOR VALUES WITH (modulus 3, remainder 0);
CREATE TABLE items_1 PARTITION OF items FOR VALUES WITH (modulus 3, remainder 1);
CREATE TABLE items_2 PARTITION OF items FOR VALUES WITH (modulus 3, remainder 2);

CREATE TABLE warehouses (warehouse_id integer primary key, location text not null);

CREATE TABLE stock (
    item_id integer not null REFERENCES items,
    warehouse_id integer not null REFERENCES warehouses,
    amount int not null
) partition by hash (warehouse_id);
CREATE TABLE stock_0 PARTITION OF stock FOR VALUES WITH (modulus 5, remainder 0);
CREATE TABLE stock_1 PARTITION OF stock FOR VALUES WITH (modulus 5, remainder 1);
CREATE TABLE stock_2 PARTITION OF stock FOR VALUES WITH (modulus 5, remainder 2);
CREATE TABLE stock_3 PARTITION OF stock FOR VALUES WITH (modulus 5, remainder 3);
CREATE TABLE stock_4 PARTITION OF stock FOR VALUES WITH (modulus 5, remainder 4);

Zde můžete vidět dva cizí klíče. Jeden ukazuje na běžnou (nerozdělenou) tabulku sklady , druhý ukazuje na položky rozdělené tabulky . Všimli jste si, že každý cizí klíč je deklarován pouze jednou?

Existují dvě základní operace, které chcete, aby cizí klíč poskytoval. Za prvé, pokud vložíte řádek do stock (odkaz tabulka), která nemá odpovídající řádek v položkách nebo sklady (odkazované tabulka), je třeba upozornit na chybu. Za druhé, pokud odstraníte řádek v kterékoli odkazované tabulce a v stock jsou odpovídající řádky , tato operace musí být také odmítnuta.

Obojí lze snadno ověřit:

INSERT INTO stock values (1, 1, 10);
ERROR:  insert or update on table "stock_0" violates foreign key constraint "stock_item_id_fkey"
DETAIL:  Key (item_id)=(1) is not present in table "items".

Dobrý. Poté můžete vložit odpovídající řádky do odkazovaných tabulek i do odkazujícího řádku. Poté se odstranění v kterékoli z odkazovaných tabulek podle očekávání nezdaří.

INSERT INTO items VALUES (1, 'item 1');
INSERT INTO warehouses VALUES (1, 'The moon');
INSERT INTO stock VALUES (1, 1, 10);

DELETE FROM warehouses;
ERROR:  update or delete on table "warehouses" violates foreign key constraint "stock_warehouse_id_fkey" on table "stock"
DETAIL:  Key (warehouse_id)=(1) is still referenced from table "stock".

DELETE FROM items;
ERROR:  update or delete on table "items_2" violates foreign key constraint "stock_item_id_fkey3" on table "stock"
DETAIL:  Key (item_id)=(1) is still referenced from table "stock".

(Samozřejmě AKTUALIZACE operace je pro předchozí operaci stejná jako INSERT , a pro druhou operaci to samé jako DELETE — což znamená, že původní i upravená n-tice musí být zkontrolovány, pokud UPDATE upravuje sloupce zahrnuté v cizím klíči.)

Pokud tyto příklady zkušeným uživatelům připadají chabé, je to proto, že tyto věci fungují od nepaměti úplně stejně pro běžné (nerozdělené) tabulky.

V reálném použití byste potřebovali indexy v odkazujících sloupcích v stock tabulky, pokud někdy upravíte odkazované tabulky. Je to proto, že server potřebuje najít tyto odkazující řádky, aby věděl, že může způsobit chybu nebo něco podobného. Můžete to udělat pomocí rozdělené referenční tabulky poměrně snadno:

CREATE INDEX ON stock (item_id);
CREATE INDEX ON stock (warehouse_id);

V tomto příspěvku jsem ukázal základy cizích klíčů a jak je lze použít na rozdělených tabulkách stejně jako na běžných tabulkách. V následujícím příspěvku se budu zabývat několika dalšími funkcemi z nich. Dejte mi vědět v komentáři, jestli se vám líbí toto vylepšení PostgreSQL 12!


  1. MySQL 8 běžné tabulkové výrazy CTE

  2. Jak exportovat všechna data z tabulky do vložitelného formátu SQL?

  3. Operátor SQL se nerovná () pro začátečníky

  4. Vrácení transakcí Entity Framework 6