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

Jedinečné omezení Postgres vs index

Měl jsem určité pochybnosti o této základní, ale důležité otázce, a tak jsem se rozhodl učit se příkladem.

Vytvoříme testovací tabulku master se dvěma sloupci, con_id s jedinečným omezením a ind_id indexováno jedinečným indexem.

create table master (
    con_id integer unique,
    ind_id integer
);
create unique index master_unique_idx on master (ind_id);

    Table "public.master"
 Column |  Type   | Modifiers
--------+---------+-----------
 con_id | integer |
 ind_id | integer |
Indexes:
    "master_con_id_key" UNIQUE CONSTRAINT, btree (con_id)
    "master_unique_idx" UNIQUE, btree (ind_id)

V popisu tabulky (\d v psql) můžete rozlišit jedinečné omezení od jedinečného indexu.

Jedinečnost

Pro jistotu ověříme jedinečnost.

test=# insert into master values (0, 0);
INSERT 0 1
test=# insert into master values (0, 1);
ERROR:  duplicate key value violates unique constraint "master_con_id_key"
DETAIL:  Key (con_id)=(0) already exists.
test=# insert into master values (1, 0);
ERROR:  duplicate key value violates unique constraint "master_unique_idx"
DETAIL:  Key (ind_id)=(0) already exists.
test=#

Funguje podle očekávání!

Cizí klíče

Nyní definujeme detail tabulka se dvěma cizími klíči odkazujícími na naše dva sloupce v master .

create table detail (
    con_id integer,
    ind_id integer,
    constraint detail_fk1 foreign key (con_id) references master(con_id),
    constraint detail_fk2 foreign key (ind_id) references master(ind_id)
);

    Table "public.detail"
 Column |  Type   | Modifiers
--------+---------+-----------
 con_id | integer |
 ind_id | integer |
Foreign-key constraints:
    "detail_fk1" FOREIGN KEY (con_id) REFERENCES master(con_id)
    "detail_fk2" FOREIGN KEY (ind_id) REFERENCES master(ind_id)

No, žádné chyby. Ujistíme se, že to funguje.

test=# insert into detail values (0, 0);
INSERT 0 1
test=# insert into detail values (1, 0);
ERROR:  insert or update on table "detail" violates foreign key constraint "detail_fk1"
DETAIL:  Key (con_id)=(1) is not present in table "master".
test=# insert into detail values (0, 1);
ERROR:  insert or update on table "detail" violates foreign key constraint "detail_fk2"
DETAIL:  Key (ind_id)=(1) is not present in table "master".
test=#

Na oba sloupce lze odkazovat v cizích klíčích.

Omezení pomocí indexu

Omezení tabulky můžete přidat pomocí existujícího jedinečného indexu.

alter table master add constraint master_ind_id_key unique using index master_unique_idx;

    Table "public.master"
 Column |  Type   | Modifiers
--------+---------+-----------
 con_id | integer |
 ind_id | integer |
Indexes:
    "master_con_id_key" UNIQUE CONSTRAINT, btree (con_id)
    "master_ind_id_key" UNIQUE CONSTRAINT, btree (ind_id)
Referenced by:
    TABLE "detail" CONSTRAINT "detail_fk1" FOREIGN KEY (con_id) REFERENCES master(con_id)
    TABLE "detail" CONSTRAINT "detail_fk2" FOREIGN KEY (ind_id) REFERENCES master(ind_id)

Nyní není žádný rozdíl mezi popisem omezení sloupců.

Částečné indexy

V deklaraci omezení tabulky nemůžete vytvářet částečné indexy. Vychází přímo z definice create table ... .V jedinečné deklaraci indexu můžete nastavit WHERE clause k vytvoření částečného indexu. Můžete také vytvořit index na výrazu (nejen na sloupci) a definovat některé další parametry (kolování, pořadí řazení, umístění hodnot NULL).

Nemůžete přidat omezení tabulky pomocí částečného indexu.

alter table master add column part_id integer;
create unique index master_partial_idx on master (part_id) where part_id is not null;

alter table master add constraint master_part_id_key unique using index master_partial_idx;
ERROR:  "master_partial_idx" is a partial index
LINE 1: alter table master add constraint master_part_id_key unique ...
                               ^
DETAIL:  Cannot create a primary key or unique constraint using such an index.


  1. Jak získat velikost databáze MySQL pro vaši databázi?

  2. Nástroj pro překlad Oracle PL/SQL do Postgresql PL/pgSQL

  3. Jak používat šablony v SQL Server Management Studio (SSMS) - SQL Server / Výukový program TSQL, část 16

  4. jak provést uloženou proceduru v SQL Developer?