<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Forum PostgreSQL - Klucz obcy]]></title>
	<link rel="self" href="http://forum.postgresql.org.pl/extern.php?action=feed&amp;tid=204&amp;type=atom"/>
	<updated>2009-05-14T10:54:21Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.postgresql.org.pl/viewtopic.php?id=204</id>
		<entry>
			<title type="html"><![CDATA[Odp: Klucz obcy]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=862#p862"/>
			<content type="html"><![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.]]></content>
			<author>
				<name><![CDATA[orcus]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=761</uri>
			</author>
			<updated>2009-05-14T10:54:21Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=862#p862</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Klucz obcy]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=824#p824"/>
			<content type="html"><![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.]]></content>
			<author>
				<name><![CDATA[psocha]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=519</uri>
			</author>
			<updated>2009-05-07T14:45:45Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=824#p824</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Klucz obcy]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=817#p817"/>
			<content type="html"><![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.]]></content>
			<author>
				<name><![CDATA[rski]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=26</uri>
			</author>
			<updated>2009-05-06T22:27:20Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=817#p817</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Klucz obcy]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=816#p816"/>
			<content type="html"><![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.]]></content>
			<author>
				<name><![CDATA[kangurmk]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=898</uri>
			</author>
			<updated>2009-05-06T21:56:49Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=816#p816</id>
		</entry>
</feed>
