SQL Problem mit FOREIGN KEY

donar

Cadet 3rd Year
Registriert
Juli 2002
Beiträge
59
Habe folgende Tabellen:

TRUNCATE TABLE title;
DROP TABLE title;

CREATE TABLE title
(title_id NUMBER(10)
CONSTRAINT title_id_pk PRIMARY KEY,

title VARCHAR2(60) NOT NULL,
description VARCHAR2(400) NOT NULL,
rating VARCHAR2(4)
CONSTRAINT rating_ch CHECK(ratingIN('G','PG','R','NC17','NR')),
category VARCHAR2(20)
CONSTRAINT category_ch CHECK(category IN('DRAMA' ,'COMEDY' ,'ACTION' ,'CHILD','DOCUMENTARY')),
release_date DATE);





TRUNCATE TABLE title_copy;
DROP TABLE title_copy;
CREATE TABLE title_copy
( copy_id NUMBER(10),
title_id NUMBER(10),
status VARCHAR2(15) NOT NULL
CONSTRAINT status_ch CHECK(status IN ('AVAILABLE','DESTROYED','RENTED','RESERVED')),
CONSTRAINT copy_id_pk PRIMARY KEY(copy_id),
CONSTRAINT title_copy_title_id_fk FOREIGN KEY (title_id)
REFERENCES title (title_id));

TRUNCATE TABLE rental;
DROP TABLE rental;
CREATE TABLE rental
( book_date DATE DEFAULT SYSDATE
CONSTRAINT book_date_pk PRIMARY KEY,
member_id NUMBER(10),
copy_id NUMBER(10),
act_ret_date DATE,
exp_ret_date DATE DEFAULT (SYSDATE + 2),
title_id NUMBER(10),
CONSTRAINT member_member_id_fk FOREIGN KEY(member_id)
REFERENCES member(member_id),
CONSTRAINT title_copy_copy_id_fk FOREIGN KEY(copy_id)
REFERENCES title_copy(copy_id),
CONSTRAINT title_copy_title_id_fk FOREIGN KEY(title_id)
REFERENCES title_copy(title_id));




Das Problem ist bei den markierten bereichen. Wenn ich nämlich die letzte Tabelle anlege kommt folgende Fehlermeldung:ORA-02270: no matching unique or primary key for this column-list

Das ist mir klar, da ja der title_id nur in der obersten tabelle primary gesetzt ist. Aber wie kann ich das problem dann umgehen?

mfg

donar
 
Zuletzt bearbeitet:
Du brauchst die Spalte title_id in der Tabelle rental doch gar nicht, da sie über die Spalte copy_id ermittelt werden kann. ;)

greetings, Keita
 
leider brauche ich die Spalte schon, ist eine Vorgabe.
 
Ähm sag ihm doch einfach das, title_id in der Tabelle titel ist:

Mein Beispiel Applikation von einen Webshop zur Veranschaulichung
PHP:
CREATE TABLE Artikelstamm (
			Artikel_Nr VARCHAR(6) NOT NULL,
			Artikel_Name VARCHAR(80) NOT NULL,
			Artikel_Hersteller NUMERIC(2),
			Artikel_Kategorie NUMERIC (2),
			Artikel_Preis_EK NUMERIC (6,2) NOT NULL,
			Artikel_Menge NUMERIC (3) NOT NULL,
			Artikel_MwST NUMERIC (1) NOT NULL,
			CONSTRAINT Artikelstamm_PK PRIMARY KEY(Artikel_Nr),
			CONSTRAINT MWST_CRC CHECK (Artikel_MwST IN (7, 16)),
			CONSTRAINT Artikel_Hersteller_FK FOREIGN KEY (Artikel_Hersteller) REFERENCES Hersteller (Hersteller_Nr),
			CONSTRAINT Artikel_KATEGORIE_FK FOREIGN KEY (Artikel_Kategorie) REFERENCES Kategorie (Kategorie_Nr),  
			CONSTRAINT Artikel_Menge_CRC CHECK (Artikel_Menge BETWEEN 1 AND 999));
			
CREATE TABLE Auftrag (
			Auftrag_Nr VARCHAR(8),
			Auftrag_Datum DATE,
			Auftrag_Preis NUMERIC(6,2) NOT NULL,
			Auftrag_ArtNr VARCHAR(6) NOT NULL,
			Auftrag_Kunde NUMERIC(6)   NOT NULL,
			Auftrag_Versand CHAR(1)	NOT NULL,
			CONSTRAINT Auftrag_PK PRIMARY KEY (Auftrag_Nr, Auftrag_ArtNr),
			CONSTRAINT Auftrag_Kunde_FK FOREIGN KEY (Auftrag_Kunde) REFERENCES Kundenstamm (Kd_Nr),
			CONSTRAINT Auftrag_Versand_PK FOREIGN KEY (Auftrag_Versand) REFERENCES Versandart (Bezahlart),
			CONSTRAINT Auftrag_ArtNr_FK FOREIGN KEY (Auftrag_ArtNr) REFERENCES Artikelstamm (Artikel_Nr),
 			CONSTRAINT Auftrag_Preis_CRC CHECK (Auftrag_Preis > 0.00));

Du solltest ihm schon verklickern wo er die Spalte "title_id" finden kann.
 
Zuletzt bearbeitet:
Beeinflusst das dann das Ergebnis nicht? In meiner Vorgabe soll ich mich auf title_copy beziehen. Kommt dann am schluss das gleiche dabei raus?
 
Nein es ist eigentlich das was du willst..

Referenz auf die Spalte title_id_copy_pk von title_id.

Nur kann jede Tabelle nur in sich sehen, sei denn du sagst ihr wo genau in der DB sich das gewünschte Objekt/Spalte befindet.
 
Zurück
Oben