eingabe in andere Tabelle prüfen

mullekular

Benutzer
Beiträge
12
hallo zusammen,

ich sitze nun schon länger an folgendem Problem.

Ich habe folgende Tabellen:
"VOGELARTEN" mit dem Attribut "VogelArten_ID" (PRIM KEY)
"Checkliste" mit "VogelArten_ID, Location_ID" (beide PRIM KEY) references Arten,Location

in der Checkliste stehen jene Vogelarten, als Location Deutschland haben.

ich soll nun während ein Vogelbeobachter seinen Eintrag in der Datenbank macht folgendes überprüfen: Ist der Vogel in der Checkliste? Es dürfen also nur Vögel die in Deutschland leben eingetragen werden.

Ich habe nun an einen Constraint gedacht und der sieht so aus:

alter table ARTEN_HAT_BEOBACHTUNGEN add constraint notINCHECKLIST
foreign key (arten_id) references Checkliste(Arten_ID);

ich bekomme aber folgende Meldung:

Fehlerbericht:
SQL-Fehler: ORA-02270: kein entsprechender Primär- o. eindeutiger Schlüssel für diese Spaltenliste
02270. 00000 - "no matching unique or primary key for this column-list"
*Cause: A REFERENCES clause in a CREATE/ALTER TABLE statement
gives a column-list for which there is no matching unique or primary
key constraint in the referenced table.
*Action: Find the correct column names using the ALL_CONS_COLUMNS
catalog view

Ich gehe davon aus das es damit zu tun hat das in checkliste 2 Primary keys liegen. zumindest ist dasmeine Vermutung. Da es sich aber bei checkliste um eine n-n beziehung handelt, kann ich das nicht ändern.

Wie kann ich also eine EIngabe in Arten_Hat_Beobachtung darauf prüfen, ob der eintrag auch in Checkliste vorhaben ist?
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.171
Wie kann ich also eine EIngabe in Arten_Hat_Beobachtung darauf prüfen, ob der eintrag auch in Checkliste vorhaben ist?

Code:
test=*# create table arten (id int primary key);
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "arten_pkey" for table "arten"
CREATE TABLE
Time: 29,177 ms
test=*# create table location(id int primary key);
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "location_pkey" for table "location"
CREATE TABLE
Time: 1,857 ms
test=*# create table checklist(id int primary key, id_art int references arten, id_loc int references location);
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "checklist_pkey" for table "checklist"
CREATE TABLE
Time: 4,075 ms
test=*# create table beobachtung (id int primary key, datum date, check_id int references checklist);
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "beobachtung_pkey" for table "beobachtung"
CREATE TABLE
Time: 16,227 ms

Andreas
 

akretschmer

Datenbank-Guru
Beiträge
9.171

Du kannst natürlich auch sagen:

Code:
test=*# create table a(c1 int, c2 int, primary key(c1,c2));
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "a_pkey" for table "a"
CREATE TABLE
Time: 5,462 ms
test=*# create table b (id int primary key, a int, b int, constraint foo foreign key (a,b) references a(c1,c2));
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "b_pkey" for table "b"
CREATE TABLE
Time: 4,792 ms

Das an Deine Tabellen anzupassen überlasse ich Dir zur Übung ;-)

Andreas
 

mullekular

Benutzer
Beiträge
12
Hallo ich glaube das ist das was ich mache. aber ich bekomme ständig fehler. hier einfach mal die tables:

create table Arten
(
Arten_ID integer not null,
Lat_Namicus varchar(200),
deutscher_Name varchar(200),
englischer_name varchar(200),
Unterart varchar(200),
PRIMARY KEY(Arten_id)
);

create table Gebiet
(
Gebiet_ID integer not Null,
Region varchar(30),
Provinz varchar(30),
Ort varchar(30),
Land varchar(30),
PRIMARY KEY (Gebiet_ID));

create table Checkliste
(
Gebiet_ID integer not NULL,
Arten_ID integer not Null,
PRIMARY KEY (Gebiet_ID, Arten_ID),
Foreign KEY (Gebiet_ID) references Gebiet,
foreign key(Arten_ID) references Arten
);

create table Arten_hat_Beobachtungen
(
Arten_ID integer not Null,
Watch_ID integer not null,
PRIMARY KEY (Arten_ID,Watch_ID),
FOREIGN KEY (Arten_ID) references Arten,
FOREIGN KEY (Watch_ID) references User_Fuehrt_Beobachtung,
check Arten_ID references Checkliste
);

kann mir jemand sagen was ich falsch mache?
 

akretschmer

Datenbank-Guru
Beiträge
9.171
Hallo ich glaube das ist das was ich mache. aber ich bekomme ständig fehler. hier einfach mal die tables:

create table Arten
(
Arten_ID integer not null,
Lat_Namicus varchar(200),
deutscher_Name varchar(200),
englischer_name varchar(200),
Unterart varchar(200),
PRIMARY KEY(Arten_id)
);

create table Gebiet
(
Gebiet_ID integer not Null,
Region varchar(30),
Provinz varchar(30),
Ort varchar(30),
Land varchar(30),
PRIMARY KEY (Gebiet_ID));

create table Checkliste
(
Gebiet_ID integer not NULL,
Arten_ID integer not Null,
PRIMARY KEY (Gebiet_ID, Arten_ID),
Foreign KEY (Gebiet_ID) references Gebiet,
foreign key(Arten_ID) references Arten
);

create table Arten_hat_Beobachtungen
(
Arten_ID integer not Null,
Watch_ID integer not null,
PRIMARY KEY (Arten_ID,Watch_ID),
FOREIGN KEY (Arten_ID) references Arten,
FOREIGN KEY (Watch_ID) references User_Fuehrt_Beobachtung,
check Arten_ID references Checkliste
);

kann mir jemand sagen was ich falsch mache?

Wenn Du aus dem letzten check Arten_id ein foreign key Arten_id(...) machst bleibt noch ein "relation "user_fuehrt_beobachtung" does not exist" ...


Andreas
 

mullekular

Benutzer
Beiträge
12
hallo nochmal ich habe

create table Arten_hat_Beobachtungen
(
Arten_ID integer not Null,
Watch_ID integer not null,
PRIMARY KEY (Arten_ID,Watch_ID),
FOREIGN KEY (Arten_ID) references Arten,
FOREIGN KEY (Watch_ID) references User_Fuehrt_Beobachtung,
check foreign key Arten_ID references Checkliste
);

Den Table "User_fuehrt_beobachtung" gibt es natürlich! ich dachte nur er sei nich so wichtig für das problem!

so will das aber auch nicht...
 

mullekular

Benutzer
Beiträge
12
kann es evtl. damit zu tun haben das bei dem Table Arten_hat_Beobachtung Arten ID references Arten ist und ich den check dann auf checkliste machen will?
 

mullekular

Benutzer
Beiträge
12
create table Arten_hat_Beobachtungen
(
Arten_ID integer not Null,
Watch_ID integer not null,
PRIMARY KEY (Arten_ID,Watch_ID),
FOREIGN KEY (Arten_ID) references Checkliste,
FOREIGN KEY (Watch_ID) references User_Fuehrt_Beobachtung,
constraint NotInCheckliste foreign key (Arten_ID) references Checkliste(Arten_ID)
);

sollte eigentlich stimmen :D vielen dank für die übung... :D

Fehler beim Start in Zeile 62 in Befehl:
create table Arten_hat_Beobachtungen
(
Arten_ID integer not Null,
Watch_ID integer not null,
PRIMARY KEY (Arten_ID,Watch_ID),
FOREIGN KEY (Arten_ID) references Checkliste,
FOREIGN KEY (Watch_ID) references User_Fuehrt_Beobachtung,
constraint NotInCheckliste foreign key (Arten_ID) references Checkliste(Arten_ID)
)
Fehler bei Befehlszeile:67 Spalte:35
Fehlerbericht:
SQL-Fehler: ORA-02256: Zahl referenzierender Spalten muss gleich Zahl referenzierter Spalten sein
02256. 00000 - "number of referencing columns must match referenced columns"
*Cause: The number of columns in the foreign-key referencing list is not
equal to the number of columns in the referenced list.
*Action: Make sure that the referencing columns match the referenced
columns.


bin mittlerweile echt nervenfertig. oracle ist echt anstregend...
 
Werbung:

mullekular

Benutzer
Beiträge
12
ja ich hab das dann später auch gesehen :D danke. ich hab nochmal ne andere frage und mach noch nen thread auf! ist glaub ich besser!
 
Oben