RE: Unikátní index a hodnoty NULL

Ing. Pavel PaJaSoft Janoušek PaJaSoft na FoNet.Cz
Pondělí Září 26 08:22:07 CEST 2005


Honza Pazdziora <mailto:adelton na fi.muni.cz> wrote:
> Asi jsem ne úplně pochopil, co se přesně chce, nicméně: V prvním
> záznamu navrhují hodnotu Pepa. Ve druhé záznamu navrhuje někdo jiný
> hodnotu Pepa. Jestli se jedná o toho samého Pepu, nebo jestli ve
> finále po schválení do čísleníku půjde Pepa Novák odkazovaný ze
> záznamu 1 a Pepa Novotný ze záznamu 2, by se přece nemělo rozhodovat
> nad tou tabulkou návrhů. Od toho tam máte to ruční schvalování, aby
> posoudilo, jestli dvě hodnoty, které vypadají stejně, také stejné
> jsou, nebo nikoli ... 

	Ano, máte pravdu, že i takto se k tomu dá přistoupit a že je to
vlastně "na odpovědnost" toho, kdo to schvaluje. V praxi je však situace, že
těchto vztahů je několik a tak bude v lidských silách poměrně těžké (zejména
za předpokladu, že schvalovatelů bude více) uhlídat návrhy tak, aby si byl
schvalovatel vědom, že se schvalují vlastně dva "stejné" záznamy (což není
správně)

> Možná kdybyste dal kompletní sadu SQL operací, které ještě mají projít
> a které už ne, vyjasnilo by to, co vlastně potřebujete.

create table tmp (id serial, id_ref int, txt_new text,
	CONSTRAINT navrhy_zakazek_pkey PRIMARY KEY (id),
	CONSTRAINT id_ref_fk FOREIGN KEY (id) REFERENCES jina_table(id) ON
UPDATE CASCADE ON DELETE SET NULL,
	CONSTRAINT misto_check CHECK (txt_new IS NULL AND id_ref IS NOT NULL
OR txt_new IS NOT NULL AND txt_new <> ''::text AND id_ref IS NULL)
);

tohle je OK, ale já bych chtěl ještě něco na způsob:

CONSTRAINT navrh_key UNIQUE (id_ref, txt_new)

s tím, že tohle projde:

INSERT INTO tmp (id_ref, txt_new) VALUES (1, NULL);
INSERT INTO tmp (id_ref, txt_new) VALUES (NULL, 'Text');

ale poté nesmí projít toto:

INSERT INTO tmp (id_ref, txt_new) VALUES (1, NULL);

nebo

INSERT INTO tmp (id_ref, txt_new) VALUES (NULL, 'Text');

Díky těm NULL hodnotám je ten navrh_key úplně zbytečný, protože veškeré
hodnoty, které lze to tabulky vložit (a na kterých už nezařvě CONSTRAINT
misto_check) budou AUTOMATICKY unikátní právě z důvodu NULL hodnot (protože
platí, že NULL <> NULL vždy)

	Jak říkám, v praxi tam těchto relací je více a tak je žádoucí
zabránit vkládání duplicitních návrhů již do této tabulky... (je logické, že
když nic jiného, že to selže při schválení, protože stejně tak jsou ty
evidenční záznamy ("ostré") unikátní v rámcí IS, jenže to už je kapánek
pozdě = je to nevhodné chování).

-------------------------------------------------------------------
Ing. Pavel Janousek (PaJaSoft)             FoNet, spol. s r. o.
Technicka podpora, Intranet/Internet     Sokolova 67, 619 00 Brno
E-mail: mailto:Janousek na FoNet.Cz         Tel.: +420  5  4324 4749
WWW:    http://WWW.FoNet.Cz/           E-mail: mailto:Info na FoNet.Cz
-------------------------------------------------------------------  



Další informace o konferenci Test