Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

eingabe in andere Tabelle prüfen

Dieses Thema im Forum "Oracle" wurde erstellt von mullekular, 16 Juni 2013.

  1. mullekular

    mullekular Benutzer

    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?
     
  2. akretschmer

    akretschmer Datenbank-Guru

    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
     
  3. akretschmer

    akretschmer Datenbank-Guru

    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
     
  4. mullekular

    mullekular Benutzer

    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?
     
  5. akretschmer

    akretschmer Datenbank-Guru

    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
     
  6. mullekular

    mullekular Benutzer

    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...
     
  7. mullekular

    mullekular Benutzer

    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?
     
  8. akretschmer

    akretschmer Datenbank-Guru

    Ist das die originale Fehlermeldung? Ich kenne Oraggle nicht, daher frag ich ...
     
  9. mullekular

    mullekular Benutzer

    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...
     
  10. akretschmer

    akretschmer Datenbank-Guru

    Ja, daher nutze ich es auch nicht ;-)

    Geh einfach die Fehler logisch durch, ich hab jetzt grad keine Zeit...
     
  11. akretschmer

    akretschmer Datenbank-Guru

    Deine Checkliste hat 2 Spalten im PK, Du versuchst mit nur einer Spalte auf diese zu referenzieren. Steht im übrigen so auch in der Fehlermeldung. Wer lesen kann, ...
     
  12. mullekular

    mullekular Benutzer

    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!
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden