PDA

Pogčedajte punu verziju : Baze i vanjski ključevi


blackshtef
26. 03. 2008., 22:08
Lijep pozdrav!

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

Zadatak je slijedeći:
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:
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:
ERROR: relation "____ (izdavac, autor, clan, posudba)" already existsŠta mi to znači?

Dalje, tablice popunjavam ovako:
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:
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:
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:
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 :)

jablan
26. 03. 2008., 22:12
Dok se ne nađe neko da pročita i ostatak posta :) :
pri kreiranju indeksa PSQL mi vraća ovaj error:
Šta mi to znači?
Indeks ne možeš nazvati isto kao i tabelu. Stavi mu neko logično ime npr idx_imetabele_imepolja.

blackshtef
26. 03. 2008., 22:43
Dok se ne nađe neko da pročita i ostatak posta :) :

Indeks ne možeš nazvati isto kao i tabelu. Stavi mu neko logično ime npr idx_imetabele_imepolja.Hvala, sad nema više tih errora :)

Još sad samo objašnjenje za onaj problem s vanjskim ključem i razina znanja će biti veća za 1 ;)

EDIT: Zapravo, sve je riješeno!
Problem je izgleda bio samo u tim indeksima...i u par "naših" slova, izgleda da nam je server tak podešen...
Uglavnom, hvala na pomoći ;)