Pogledajte određenu poruku
Staro 26. 03. 2008.   #1
blackshtef
profesionalac
Qualified
 
Avatar blackshtef
 
Datum učlanjenja: 27.09.2007
Lokacija: Grubišno Polje - Varaždin
Poruke: 104
Hvala: 10
3 "Hvala" u 2 poruka
blackshtef is on a distinguished road
Pošaljite poruku preko MSN za blackshtef Pošaljite poruku preko Skype™ za blackshtef
Question Baze i vanjski ključevi

Lijep pozdrav!

Ovako, imam nekih početničkih problema s bazama...radi se o PostgreSQL-u.

Zadatak je slijedeći:
Citat:
Prvo je potrebno popuniti tablicu izdavac i to samo vrijednost atributa naziv (sifra se uvećava automatski pošto se radi o tipu podatka serial).
Nakon toga se može popuniti tablica autor (prezime, ime), s time da se sifra također uvećava automatski.
Nakon toga popuniti podatke o knjigama (ISBN, godina, naslov, izdavac); šifra knjige se uvećava automatski, a vrijednost atributa izdavac mora odgovarati sifri nekog izdavaca jer se radi o vanjskom ključu.
I na kraju potrebno je popuniti tablicu autor_knjige; unose se šifra knjige i šifra autora; ako knjiga ima više autora, za svakog autora je potrebno dodati po jedan redak u tablicu autor_knjige).
I sada, tablice i indekse sam kreirao ovako:
Kôd:
CREATE TABLE izdavac (sifra serial PRIMARY KEY,naziv VARCHAR(50) NOT NULL);
CREATE TABLE knjiga (sifra serial PRIMARY KEY,ISBN VARCHAR (15),naziv VARCHAR(50) NOT NULL,godina SMALLINT NOT NULL CHECK (godina BETWEEN 1970 AND 2050),izdavac integer REFERENCES izdavac ON DELETE RESTRICT ON UPDATE CASCADE);
CREATE TABLE autor (sifra serial PRIMARY KEY,ime VARCHAR(20) NOT NULL,prezime VARCHAR(20) NOT NULL);
CREATE TABLE autor_knjige (knjiga integer REFERENCES knjiga,autor integer REFERENCES autor,CONSTRAINT pk1 PRIMARY KEY (knjiga,autor));
CREATE TABLE clan (sifra serial PRIMARY KEY,ime VARCHAR(20) NOT NULL,prezime VARCHAR(20) NOT NULL,adresa VARCHAR(50) NOT NULL);
CREATE TABLE posudba (clan integer REFERENCES clan,datum_posudbe DATE,datum_vracanja DATE,knjiga integer REFERENCES knjiga,CONSTRAINT pk2 PRIMARY KEY (clan,knjiga,datum_posudbe));

CREATE UNIQUE INDEX izdavac ON izdavac(naziv);
CREATE UNIQUE INDEX autor ON autor(prezime,ime);
CREATE UNIQUE INDEX clan ON clan(prezime);
CREATE INDEX posudba ON posudba(datum_posudbe,datum_vracanja);
No, pri kreiranju indeksa PSQL mi vraća ovaj error:
Citat:
ERROR: relation "____ (izdavac, autor, clan, posudba)" already exists
Šta mi to znači?

Dalje, tablice popunjavam ovako:
Kôd:
INSERT INTO izdavac VALUES (default,'DRIP');
INSERT INTO izdavac VALUES (default,'Informator');
INSERT INTO izdavac VALUES (default,'Narodne Novine');
INSERT INTO izdavac VALUES (default,'Addison Wesley');

INSERT INTO autor VALUES (default,'Tkalac','Slavko');
INSERT INTO autor VALUES (default,'Čubrilo','Mirko');
INSERT INTO autor VALUES (default,'Crnko','Nenad');
INSERT INTO autor VALUES (default,'Radovan','Mario');
INSERT INTO autor VALUES (default,'Strahonja','Vjeran');
INSERT INTO autor VALUES (default,'Žugaj','Miroslav');
INSERT INTO autor VALUES (default,'Bača','Miroslav');
INSERT INTO autor VALUES (default,'Date','Christopher');
Tu sve prođe ok.

No, sad dolazi dio zadatka koji kaže da treba popuniti podatke o knjigama (šifra, isbn, naziv, godina, izdavac); šifra knjige se uvećava automatski, a vrijednost atributa izdavac mora odgovarati šifri nekog izdavaca jer se radi o vanjskom ključu.
E, sad. Tu sam se izgubio, šta je taj vanjski ključ? Pretpostavljam da se pomoću njega radi veza na tablicu izdavac i da se onda prema šifri izdavača u tablicu knjiga vrati ta šifra. No neznam kako to napisati.
Ono što sam ja izveo jest:
Kôd:
INSERT INTO knjiga VALUES (default,'','Relacijski model podataka','1993','1');
INSERT INTO knjiga VALUES (default,'953-6363-04-6','Visual Basic, vizualni pristup programiranju','1994','1');
INSERT INTO knjiga VALUES (default,'','Matematička logika za ekspertne sisteme','1989','2');
INSERT INTO knjiga VALUES (default,'86-301-0223-3','Programiranje u Prologu','1990','2');
INSERT INTO knjiga VALUES (default,'953-170-002-8','Baze podataka: relacijski pristup i SQL','1993','2');
INSERT INTO knjiga VALUES (default,'','Projektiranje informacijskih sustava','1989','2');
INSERT INTO knjiga VALUES (default,'','Informacijski sustavi proizvodnje','1992','2');
INSERT INTO knjiga VALUES (default,'','Uvod u računalnu sigurnost','2004','3');
INSERT INTO knjiga VALUES (default,'','An Introduction to Database Systems','2004','4');
INSERT INTO knjiga VALUES (default,'','What not how - the business rules approach','2000','4');
gdje je prva vrijednost autoincrement šifre, jel, zatim isbn (negdje ga nema, pa je prazno, odnosno samo su navodni znaci), naslov knjige, godina, i ova zadnja brojka je ta šifra. Jel to dobro tak?

Zapravo, kad bi riješio taj problem, znao bih napraviti i zadnji dio zadatka:
Citat:
I na kraju potrebno je popuniti tablicu autor_knjige; unose se šifra knjige i šifra autora; ako knjiga ima više autora, za svakog autora je potrebno dodati po jedan redak u tablicu autor_knjige)
Moje rješenje tog dijela:
Kôd:
INSERT INTO autor_knjige VALUES (1,1);
INSERT INTO autor_knjige VALUES (2,2);
INSERT INTO autor_knjige VALUES (2,3);
INSERT INTO autor_knjige VALUES (3,2);
INSERT INTO autor_knjige VALUES (4,4);
INSERT INTO autor_knjige VALUES (5,4);
INSERT INTO autor_knjige VALUES (6,4);
INSERT INTO autor_knjige VALUES (7,5);
INSERT INTO autor_knjige VALUES (7,6);
INSERT INTO autor_knjige VALUES (8,7);
INSERT INTO autor_knjige VALUES (9,8);
INSERT INTO autor_knjige VALUES (10,8);
Ja se ispričavam na duljini posta, i na možda kompliciranom objašnjavanju što mi zapravo nije jasno, al neznam kako bih drugačije
__________________
I, blackshtef
blackshtef je offline   Odgovorite uz citat