Probleme mit Foreign Key

pentragon79

Benutzer
Beiträge
11
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
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.028
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


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
 

akretschmer

Datenbank-Guru
Beiträge
9.028
Ich weiss nicht wie ich das unique beo phpmyadmin entfernen kann in der struktur.

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
 

pentragon79

Benutzer
Beiträge
11
Hallo Danke, ja ich habe das unique entfernt mit Alter table und drop. Nun habe ich auch wieder FK Beziehung, ich probiere es nochmal.
 

pentragon79

Benutzer
Beiträge
11
Fehler

SQL-Befehl: Bearbeiten
INSERT INTO `reber`.`mietobjekt` (
`ObjektNr` ,
`PLZ` ,
`Ort` ,
`Typ` ,
`Zimmer` ,
`Mietzins` ,
`Betreuer` ,
`BesitzerNr`
)
VALUES (
NULL , '45454', '435345', '3454', '43436', NULL , NULL , '1'
)
MySQL meldet:
#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.
 

akretschmer

Datenbank-Guru
Beiträge
9.028
#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.

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
 

pentragon79

Benutzer
Beiträge
11
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.
 

pentragon79

Benutzer
Beiträge
11
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.
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.028
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.

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

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.

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
 
Oben