Citat:
stsung:Nisi u pravu kada kazhesh da "svaki kljuch jedinstveno odredjuje red u tabeli".
Po svojoj
definiciji ključ (ili da budem precizniji - superključ) jedinstveno određuje red u tabeli.
Uzmimo primer:
Code:
CREATE TABLE automobili (
serijski_broj_sasije VARCHAR(25) NOT NULL,
serijski_broj_motora VARCHAR(25) NOT NULL
);
Oba atributa - i 'serijski_broj_sasije' i 'serijski_broj_motora' su sami za sebe ključevi jer jedinstveno identifikuju određeni automobil. Preciznije, oni su kandidatni ključevi. Ova činjenica se u SQL-u na žalost zapisuje upotrebom UNIQUE INDEX-a:
Code:
CREATE UNIQUE INDEX ind_sasija ON automobili(serijski_broj_sasije);
CREATE UNIQUE INDEX ind_motor ON automobili(serijski_broj_motora);
Pošto su ove dve kolone ključevi mogu da ih referenciram iz neke druge (treće) tabele:
Code:
CREATE TABLE registarske_tablice (
registarski_broj VARCHAR(8) NOT NULL,
serijski_broj_sasije VARCHAR(25) NOT NULL
REFERENCES automobili(serijski_broj_sasije)
);
CREATE TABLE putni_nalozi (
broj_putnog_naloga INTEGER NOT NULL,
serijski_broj_motora VARCHAR(25) NOT NULL
REFERENCES automobili(serijski_broj_motora)
);
Prilikom referenciranja na tabelu automobili, a pošto nisam definisao primarni (default) ključ, morao sam da navodim i kolone na koje se referenciram!
Sada mogu da se odlučim da proglasim 'serijski_broj_motora' za primarni ključ pomoću:
Code:
ALTER TABLE automobili
ADD CONSTRAINT pk_aut PRIMARY KEY (serijski_broj_motora);
Pošto sam definisao primarni ključ (opet da ponovim u SQL terminologiji nije ništa drugo nego podrazumevani-default ključ) sada mogu nove reference da obavim BEZ navođenja kolona na koje se referenciram a sistem će za to iskoristiti moj default ključ:
Code:
CREATE TABLE servisni_nalozi (
broj_servisnog_naloga INTEGER NOT NULL,
serijski_broj_motora VARCHAR(25) NOT NULL
REFERENCES automobili
);
Da rezimiram:
- tabela 'automobili' ima dva ključa i to su pojedinačne kolone 'serijski_broj_sasije' i 'serijski_broj_motora',
- podrazumevani (primarni) ključ za tabelu 'automobili' je kolona 'serijski_broj_motora',
- kada se referenciram na tabelu 'automobili' i hoću da se referenciram na kolonu 'serijski_broj_motora', tada nemoram (a mogu) da navedem tu kolonu jer je ona podrazumevana,
- kada se referenciram na tabelu 'automobili' i hoću da se referenciram na kolonu 'serijski_broj_sesije', tada moram da navedem i tu kolonu prilikom referenciranja.
"The best code is no code at all."
- Zidar (ES član)
"Biggest obstacle to learning
SQL is unlearning procedural
programming." - Joe
Celko
"Minimize code, maximize data."
- A. Neil Pappalardo