» »

SQL Parent key not found

SQL Parent key not found

Ciklamen ::

Čaos.

Za faks imamo nalogo nardit neko bazo za določeno temo. Težavo imam, ko probam polnit to tabelo s pomočjo procedur (za katero koli število vnosov), češ da ni starševskega ključa (oziroma da tuji ključ ne obstaja). Imam 4 tabele s samimi tujimi ključi, od teh samo ena deluje, če je na njej constraint (t.j. tuj ključ) za 100.000, 1.000.000 in 10.000.000 vnosov, če pa poizkusim napolnit katero koli drugo tabelo pa mi javi napako "integrity constraint (blabla.blabla) violated - parent key not found", kljub temu, da imam pri vseh enako spisan constraint...

Še prilagam kodo, da bo lažje razumevanje kaj sploh delam(o):

CREATE TABLE TECAJI(
ID_TECAJA NUMBER(10) NOT NULL,
IME_TECAJA VARCHAR2(30),
PODROCJE VARCHAR2(20)
);

CREATE TABLE PREDAVANJA(
ID_PREDAVANJA NUMBER(10) NOT NULL,
IME_PREDAVANJ VARCHAR2(30),
OD_KDAJ DATE,
DO_KDAJ DATE,
TERMIN_OD DATE,
TERMIN_DO DATE
);

...

CREATE TABLE POUCUJE(
ID_PROFESORJA NUMBER(10) NOT NULL,
ID_PREDAVANJA NUMBER(10) NOT NULL,
ID_TECAJA NUMBER(10) NOT NULL,
OBISKANOST NUMBER(5)
);

CREATE TABLE LOKACIJA(
ID_TECAJA NUMBER(10) NOT NULL,
ID_PREDAVANJA NUMBER(10) NOT NULL,
LOKACIJA VARCHAR2(20),
UCILNICA VARCHAR2(20)
);

ALTER TABLE TECAJI ADD (CONSTRAINT PK_TECAJI PRIMARY KEY (ID_TECAJA));
ALTER TABLE PREDAVANJA ADD (CONSTRAINT PK_PREDAVANJA PRIMARY KEY (ID_PREDAVANJA));

ALTER TABLE POUCUJE ADD (CONSTRAINT FK_POUCUJE_ID_PROFESOR FOREIGN KEY (ID_PROFESORJA) REFERENCES OSEBE(ID_OSEBE));
ALTER TABLE POUCUJE ADD (CONSTRAINT FK_POUCUJE_ID_PREDAVANJA FOREIGN KEY (ID_PREDAVANJA) REFERENCES PREDAVANJA(ID_PREDAVANJA));

ALTER TABLE LOKACIJA ADD (CONSTRAINT FK_LOKACIJA_ID_PREDAVANJA FOREIGN KEY (ID_PREDAVANJA) REFERENCES PREDAVANJA(ID_PREDAVANJA));
ALTER TABLE LOKACIJA ADD (CONSTRAINT FK_LOKACIJA_ID_TECAJ FOREIGN KEY (ID_TECAJA) REFERENCES TECAJI(ID_TECAJA));



Pa še polnjenje:

PROCEDURE polni_lokacijo(stevilo_lokacij NUMBER) IS
		fkID_TECAJA NUMBER(10);
		fkID_PREDAVANJA NUMBER(10);
		LOKACIJA VARCHAR2(20);
		UCILNICA VARCHAR2(20);
	BEGIN
		FOR st IN 1..stevilo_lokacij LOOP
			fkID_TECAJA := dbms_random.value(1, 1000);
			fkID_PREDAVANJA := dbms_random.value(1,1000);
			LOKACIJA := 'Lokacija';
			UCILNICA := 'Ucilnica';
			LOKACIJA := LOKACIJA ||' '|| TO_CHAR(st);
			UCILNICA := UCILNICA ||' '|| TO_CHAR(st);
			INSERT INTO LOKACIJA(ID_TECAJA, ID_PREDAVANJA, LOKACIJA, UCILNICA) 
			VALUES (fkID_TECAJA, fkID_PREDAVANJA, LOKACIJA, UCILNICA);
		END LOOP;
	END;

	PROCEDURE polni_poucuje(stevilo_poucevanj NUMBER) IS
		fkID_PROFESORJA NUMBER(10);
		fkID_PREDAVANJA NUMBER(10);
		fkID_TECAJA NUMBER(10);
		OBISKANOST NUMBER(10);
	BEGIN
		FOR st IN 1..stevilo_poucevanj LOOP
			fkID_PROFESORJA := dbms_random.value(1,1000);
			fkID_PREDAVANJA := dbms_random.value(1,1000);
			fkID_TECAJA := dbms_random.value(1,1000);
			OBISKANOST := dbms_random.value(100,15000);
			INSERT INTO POUCUJE (ID_PROFESORJA, ID_PREDAVANJA, ID_TECAJA, OBISKANOST)
			VALUES (fkID_PROFESORJA, fkID_PREDAVANJA, fkID_TECAJA, OBISKANOST);
		END LOOP;
	END;



Any ideas? Jebem se že lep čas s tem, pa ne najdem vzroka kaj bi bilo narobe...
- End of the Post ->

dukedl ::

čist možno, da za vrednost fkID_PROFESORJA še ne obstaja ID_OSEBE v tabeli OSEBE, ker ga funkcija naredi naključno (maš očitno ravno tako smolo)?

maš vse idje v tabeli OSEBE napolnjene do 1000?
lp dukedl

Ciklamen ::

Pozabil sem dodat, da za POUCUJE ravno zadeva deluje, za LOKACIJA pa ne (pa so podatki napolnjeni za 1000 vrstic), edino če so indeksi tako zmrdani v LOKACIJA, da noben ključ ne referencira na dane podatke iz predavanj/tečajev? Vidim da sem pozabil še zgoraj en constraint za POUCUJE, ampak kot sem že rekel, ta tabela deluje, vse ostale pa ne...
- End of the Post ->

dukedl ::

torej imaš tabelo TECAJI in PREDAVANJA polni (vseh od 1 do 1000)?

Ker nima veze tle kok maš polno tabelo LOKACIJA (ker se itak polni naključno), morajo pa vsi ključi, ki jih loop dodaja v to tabelo že obstajati v TECAJI in PREDAVANJA.
lp dukedl

Ciklamen ::

Jap, polni sta. Tudi če jih query-am, je 1000 vrstic v obeh.
- End of the Post ->

dukedl ::

pa so idji od 1 do 1000 v obeh tabelah (ID_TECAJA, ID_PREDAVANJA)?
al maš samo 1000 vrstic (pa so idji naključni)?

ker ti najbrž random funkcija glih tiste idje poišče, ki ne obstaja ;)
lp dukedl

Ciklamen ::

Ravno to sem sedaj opazil, da so idji za predavanja 10000(+- 1000) in za tecaji 107000 (+-1000).

Možno je tudi, da sekvence zmrdajo zadeve.. (ki sem sploh pozabil, da jih imam noter :D)

EDIT: visoki IDji so pa zato, ker sem že parkrat polnil tabele z večimi podatki, v upanju da bi kaj pomagalo :D
- End of the Post ->

Zgodovina sprememb…

  • spremenil: Ciklamen ()

Ciklamen ::

Takle mamo, odstranil sem triggerje (sekvence) in zadeva špila. I'm dumb, pardon :D Sem šele sedaj začel razmišljat, ko sem šel gledat IDje od obeh tabel, da so previsoki...
- End of the Post ->


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

oracle 12 identity (the old way)

Oddelek: Programiranje
6990 (795) detroit
»

PostgreSQL pomoč

Oddelek: Programiranje
162370 (1863) Mato989
»

SQL pomoč

Oddelek: Programiranje
132229 (1643) miko22
»

SQL težava

Oddelek: Programiranje
364581 (3863) joseti
»

SQL problem

Oddelek: Programiranje
6921 (859) dejc009

Več podobnih tem