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

Probleme mit Foreign Key

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von pentragon79, 13 März 2013.

  1. pentragon79

    pentragon79 Benutzer

    Hallo liebe Foris,

    ich habe ein kleines Problem. Ich verzweifle.

    Ich habe eine Datenbank mit zwei Tabellen.

    1. Tabelle: Besitzer (BesitzerID als Primary Key AUTO_INCREMENT)
    2. Tabelle:Mietobjekt(ObjektID als Primary Key AUTO_INCREMENT und BesitzerID als Foreign Key)

    Mein Problem: Ein Besitzer kann ja mehrere Mietobjekte(Häuser) besitzen.
    BesitzerID : 1 hat schon ein Mietobjekt mit ObjektID 1 und Foreign Key BesitzerId: 1

    Jetzt wird für BesitzerId: 1 ein zweites Objekt eingetragen: also ObjektID: 2 Foreign Key BesitzerId:1

    nun wird ein Fehler beim anlegen des zweiten Mietobjektes für Besitzer 1 angezeigt:

    #1062 - Duplicate entry '1' for key 'BesitzerNr'

    ich weiß nicht an was es liegt

    Hilfe wäre sehr nett.
    Danke im Voraus.

    Gruss setfan
     
  2. akretschmer

    akretschmer Datenbank-Guru


    Dann hast Du da ein UNIQE angelegt, vermutlich. Ich zeige Dir es richtig und nach dem Rollback falsch mit Deiner Fehlermeldung, nur in PG:

    Code:
    test=*# create table mietobjekt (objekt_id int primary key, besitzer int references besitzer);
    NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "mietobjekt_pkey" for table "mietobjekt"
    CREATE TABLE
    Time: 76,685 ms
    test=*# insert into besitzer values (1);
    INSERT 0 1
    Time: 0,419 ms
    test=*# insert into mietobjekt values (1,1);
    INSERT 0 1
    Time: 10,479 ms
    test=*# insert into mietobjekt values (2,1);
    INSERT 0 1
    Time: 0,306 ms
    test=*# rollback;
    ROLLBACK
    Time: 0,646 ms
    test=# create table besitzer(besitzer_id int primary key);
    NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "besitzer_pkey" for table "besitzer"
    CREATE TABLE
    Time: 5,566 ms
    test=*# create table mietobjekt (objekt_id int primary key, besitzer int references besitzer unique);
    NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "mietobjekt_pkey" for table "mietobjekt"
    NOTICE:  CREATE TABLE / UNIQUE will create implicit index "mietobjekt_besitzer_key" for table "mietobjekt"
    CREATE TABLE
    Time: 4,683 ms
    test=*# insert into besitzer values (1);
    INSERT 0 1
    Time: 0,392 ms
    test=*# insert into mietobjekt values (1,1);
    INSERT 0 1
    Time: 0,678 ms
    test=*# insert into mietobjekt values (2,1);
    ERROR:  duplicate key value violates unique constraint "mietobjekt_besitzer_key"
    DETAIL:  Key (besitzer)=(1) already exists.
    Time: 0,339 ms
    test=*#
     
    
    Also: zeig uns Deine Tabellen, wir zeigen Dir Deine Fehler ;-)

    Andreas
     
  3. pentragon79

    pentragon79 Benutzer

    Soll ich die Tabellen am besten exportieren? Und wenn ja in welchem Format?
     
  4. pentragon79

    pentragon79 Benutzer

    Ich weiss nicht wie ich das unique beo phpmyadmin entfernen kann in der struktur.
     
  5. akretschmer

    akretschmer Datenbank-Guru

    Wie das mit PMA geht weiß ich auch nicht, es geht aber via SQL und ALTER TABLE:

    Code:
    test=# create table besitzer(besitzer_id int primary key);
    NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "besitzer_pkey" for table "besitzer"
    CREATE TABLE
    Time: 7,779 ms
    test=*# create table mietobjekt (objekt_id int primary key, besitzer int references besitzer unique);
    NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "mietobjekt_pkey" for table "mietobjekt"
    NOTICE:  CREATE TABLE / UNIQUE will create implicit index "mietobjekt_besitzer_key" for table "mietobjekt"
    CREATE TABLE
    Time: 19,622 ms
    test=*# alter table mietobjekt drop constraint mietobjekt_besitzer_key;
    ALTER TABLE
    Time: 17,732 ms
    test=*# insert into besitzer values (1);
    INSERT 0 1
    Time: 0,533 ms
    test=*# insert into mietobjekt values (1,1);
    INSERT 0 1
    Time: 0,652 ms
    test=*# insert into mietobjekt values (2,1);
    INSERT 0 1
    Time: 0,307 ms
    
    Das dürfte in MySQL recht ähnlich gehen, vermutlich.

    Andreas
     
  6. pentragon79

    pentragon79 Benutzer

    Hallo Danke, ja ich habe das unique entfernt mit Alter table und drop. Nun habe ich auch wieder FK Beziehung, ich probiere es nochmal.
     
  7. pentragon79

    pentragon79 Benutzer

    Fehler

    SQL-Befehl: [​IMG] Bearbeiten
    INSERT INTO `reber`.`mietobjekt` (
    `ObjektNr` ,
    `PLZ` ,
    `Ort` ,
    `Typ` ,
    `Zimmer` ,
    `Mietzins` ,
    `Betreuer` ,
    `BesitzerNr`
    )
    VALUES (
    NULL , '45454', '435345', '3454', '43436', NULL , NULL , '1'
    )
    MySQL meldet: [​IMG]
    #1062 - Duplicate entry '1' for key 'BesitzerNr'

    Dies ist der Fehler ein unique besteht nicht. Es gibt nur einen index der die FK beziehung von `besitzer`.`BesitzerNr` anzeigt.
     
  8. akretschmer

    akretschmer Datenbank-Guru

    Tja, ohne zu sehen, wie die Tabelle angelegt ist mit welchen Indexen, ist es halt schwer, das zu erraten.

    Was sagt denn 'show create table <tablename>'?


    Andreas
     
  9. pentragon79

    pentragon79 Benutzer

    13-03-2013 13-27-40.jpg
    Dies ist von der Tabelle Mietobjekt. Tabelle besitzer ist BesitzerNr PrimaryKey
    Wenn ich über php myAdmin die Tabelel befülle kommt eben der Fehler.
     
  10. akretschmer

    akretschmer Datenbank-Guru

    Ich wiederhole mein Frage: was zeigt 'show create table mietobjekt' an?
     
  11. pentragon79

    pentragon79 Benutzer

    Es wird dies angezeigt: mietobj.jpg
     
  12. akretschmer

    akretschmer Datenbank-Guru

    Bilder nerven. Mich zumindest. Geht irknwie gar nicht, diese via Copy&Paste z.B. in einer MySQL-Konsole auszuführen...

    Andreas
     
  13. pentragon79

    pentragon79 Benutzer

    Hallo,
    deine letzte Nachricht habe ich leider nicht richtig verstanden. Also ich führe die Befehle von Hand in der Console aus, da ich ja etwas lernen will. Das Ergebnis habe ich hier per copy und paste eingefügt, wieso auch nicht. Wenn es das ist was du meinst.
    Jetzt habe ich den Befehl ausgeführt und was meinst du nun? Ich hatte ihn schon nach der ersten Aufforderung von dir ausgeführt, allerdings zeigt er ja nur den PrimaryKey an deswegen habe ich es nicht erwähnt.
     
  14. akretschmer

    akretschmer Datenbank-Guru

    Nun, ich sehe Bilder. Da steht zwar text drin, den kann ich aus dem Bild aber nicht separat markieren, kopieren und einfügen. Es gelingt einfach nicht...

    Ich hab es mal nachvollzogen:

    Code:
    mysql> create table besitzer(besitzer_id int primary key) engine innodb;
    Query OK, 0 rows affected (0.03 sec)
    
    mysql> create table mietobjekt (objekt_id int primary key, besitzer int references besitzer) engine innodb;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql>
    mysql> insert into besitzer values (1);
    Query OK, 1 row affected (0.01 sec)
    
    mysql> insert into mietobjekt values (1,1);
    Query OK, 1 row affected (0.00 sec)
    
    mysql> insert into mietobjekt values (2,1);
    Query OK, 1 row affected (0.01 sec)
    
    mysql>
    
    Das funzt also.

    Code:
    mysql> show create table mietobjekt;
    +------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | Table      | Create Table                                                    |
    +------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | mietobjekt | CREATE TABLE `mietobjekt` (
      `objekt_id` int(11) NOT NULL,
      `besitzer` int(11) default NULL,
      PRIMARY KEY  (`objekt_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
    +------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)
    
    So sieht man auch den Aufbau der Tabelle, zur Kontrolle. Das MySQL hier nicht den Fremdschlüssel anzeigt, nun ja. Schöner ist aber:

    Code:
    mysql> insert into mietobjekt values (3,3);
    Query OK, 1 row affected (0.01 sec)
    
    TOLL! Egal.

    Andreas
     
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