<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title><![CDATA[Forum PostgreSQL - Klucz obcy]]></title>
		<link>https://forum.postgresql.org.pl/viewtopic.php?id=204</link>
		<description><![CDATA[Najświeższe odpowiedzi w Klucz obcy.]]></description>
		<lastBuildDate>Thu, 14 May 2009 10:54:21 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Odp: Klucz obcy]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=862#p862</link>
			<description><![CDATA[Ale przecież w odcinku możesz mieć NULL'e. Chociażby coś takiego:
[code]
create table test (a integer, b integer, primary key (b));
create table test1 (c integer, d integer, Primary Key (c), foreign key (d) references test (b));
insert into test values (1,1);
insert into test1 values (1,1);
insert into test1 values (2,NULL);
 c |   d
---+--------
 1 |      1
 2 | [null]
(2 rows)
[/code]
I jak widać działa. Wówczas zawieszeni nie na odcinku a przez admina będą mieli NULL'a. Dodatkowo jak będziesz chciał wiedzieć który admin możesz zrobić analogicznie dla uid'a danego użytkownika. 
Zapewniona zarówno integralność jak i funkcjonalność.
Aha - i jeszcze jedno, może oczywiste ale często zapominane. Foreign Key nie musi kierować na Primary Key - wystarczy indeks typu UNIQUE, wiec w danych po drugiej stronie też mogą być NULL'e jakbyś łączył się do tabeli która ma dwie wartości i jedna lub obie mogą być NULL'ami.]]></description>
			<author><![CDATA[dummy@example.com (orcus)]]></author>
			<pubDate>Thu, 14 May 2009 10:54:21 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=862#p862</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Klucz obcy]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=824#p824</link>
			<description><![CDATA[Trochę FAIL podejście aby opisywać coś w ten sposób.

Jeśli coś opisujesz atrybutami i chcesz walidować dane za pomocą kluczy obcych to niech tak zostanie. Nie róbmy nic na silę.
Jeśli admin moze zablokować i jest to kolejny atrybut opisujący to dodaj kolumnę. np: typem bool ;]

Trochę mi się to kłoci z relacyjnością w bazie :> Chyba ze idziemy w koncepcje bigtable :)

Możesz zrobić tak jak rski mówi ale wtedy TY musisz zadbać o spójność danych w bazie.]]></description>
			<author><![CDATA[dummy@example.com (psocha)]]></author>
			<pubDate>Thu, 07 May 2009 14:45:45 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=824#p824</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Klucz obcy]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=817#p817</link>
			<description><![CDATA[No nie no klucz obcy to klucz obcy, nie ma wyjątków ... chyba :).

Nie ma czegoś takiego
[quote]
Jeśli klucz obcy może odnosić się do dwóch rożnych tabel
...
napisać REFERENCES odcinki(numer), admin(id)
[/quote]

Jak na mój gust zamiast klucza głównego potrzebujesz triggera na tabeli kierowcy, który będzie sprawdzał czy zawieszony_numer_odcinka wstawiasz cos co jest juz w tabeli odcinki lub 0.]]></description>
			<author><![CDATA[dummy@example.com (rski)]]></author>
			<pubDate>Wed, 06 May 2009 22:27:20 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=817#p817</guid>
		</item>
		<item>
			<title><![CDATA[Klucz obcy]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=816#p816</link>
			<description><![CDATA[Mam dwie tabele odcinki, o schemacie: <numer, nazwa, zakończony>, gdzie numer to klucz główny, oraz tabele kierowcy, w której mam miedzy innymi atrybuty zawieszony i zawieszony_numer_odcinka, które oznaczają odpowiednio czy kierowca został zawieszony i na którym odcinku rajdu zawieszono kierowce.
Zatem naturalne jest, aby zawieszony_numer_odcinka był kluczem obcym i odnosił się do klucza numer w tabeli odcinki. Ale zawiesić kierowce może także administrator rajdu, wtedy też w polu zawieszony_numer_odcinka umieszczamy np wartość 0, jednak w tabeli odcinki nie ma odcinka o numerze 0 (bo administrator nie jest odcinkiem przecież), więc nie możemy wstawić tej wartości do pola zawieszony_numer_odcinka.
Czy istnieje jednak możliwość aby zawieszony_numer_odcinka był kluczem obcym i jednocześnie mógł przyjmować jakąś wybraną wartość (w tym przypadku 0), która nie znajduje się w tabeli do której ten klucz się odnosi? Taki klucz obcy z wyjątkiem?

Jeśli klucz obcy może odnosić się do dwóch rożnych tabel, to można utworzyć tabele admin z atrybutem id o wartości 0 i przy zawieszony_numer_odcinka napisać REFERENCES odcinki(numer), admin(id) ale z tego co zrozumiałem ze schematu polecenia CREATE TABLE nie można tego zrobić, nie jestem jednak tego pewien.]]></description>
			<author><![CDATA[dummy@example.com (kangurmk)]]></author>
			<pubDate>Wed, 06 May 2009 21:56:49 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=816#p816</guid>
		</item>
	</channel>
</rss>
