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

Jak PostgreSQL vynucuje omezení UNIQUE / jaký typ indexu používá?

nebo - vytvořte index a nepředpokládejte, že hodnoty jsou jedinečné

Je lze bezpečně předpokládat, že hodnoty jsou jedinečný, pokud máte definovaný jedinečný index. Tak jsou implementována jedinečná omezení (v současné době a pravděpodobně i ve všech budoucích verzích).

Definování UNIQUE omezení dělá efektivně totéž (téměř, viz níže) jako vytvoření jedinečného indexu bez určení typu indexu. A cituji manuál:

Možnosti jsou btree, hash, gist a gin. Výchozí metoda je btree.

Přidání omezení je pouze kanonický způsob, který by se v budoucích verzích nezlomil tam, kde by mohl implementovat jinak. To je vše.

A ne, jedinečné omezení lze implementovat pouze se základním bstromem index ve všech verzích až po PostgreSQL v14 včetně. Cituji odstavec „ADD table_constraint_using_index“ v manuálu zde:

Index nemůže mít sloupce výrazů ani nemůže být částečným indexem. Také to musí být index b-stromu s výchozím řazením.

###Další rozdíly

  • Jedinečná omezení lze odložit . To u jedinečných indexů není možné. Podívejte se na SET CONSTRAINTS a postupujte podle odkazů.
- **cizí klíč** nemůže odkazovat na sloupce s *pouze* jedinečným indexem. [Manuál:][4]

Cizí klíč musí odkazovat na sloupce, které jsou buď primárním klíčem, nebo tvoří jedinečné omezení.

Poslední kousek se zdá být zastaralý nebo nedorozumění ze strany getgo. Viz:

  • Hodnoty NULL pro sloupce reference_constraints.unique_constraint_* v informačním schématu

Související:

  • Je jedinečný index lepší než jedinečné omezení, když potřebuji index s třídou operátorů



  1. Jak ladit postgresql uložené procedury?

  2. Jak změnit schéma objektu (tabulka, zobrazení, uložená procedura) v databázi SQL Server - SQL Server / Výukový program TSQL část 28

  3. Mohu to vyřešit pomocí čistého mysql? (spojení na oddělených hodnotách ve sloupci)

  4. LOAD DATA LOCAL INFILE zakázáno v... PHP