# mysql 4.1.10 foreign keys



## waterhouse533-lp (5. April 2005)

hallo leute,
 ich habe eine datenbank mit mehreren innodb-tabellen angelegt. jetzt moechte ich foreign keys hinzufuegen. bei einigen tabellen funktioniert das sehr gut, bei anderen gar nicht.
 als beispiel sollen diese beide create-statements dienen:

 'region_markt', 'CREATE TABLE `region_markt` (
   `regionnr` smallint(6) NOT NULL default '0',
   `marktnr` int(11) NOT NULL default '0',
   `cdc` int(11) NOT NULL default '0',
   `netstate` char(3) NOT NULL default 'C',
   PRIMARY KEY  (`regionnr`,`marktnr`),
   KEY `Regionnr` (`regionnr`),
   CONSTRAINT `Regionnr` FOREIGN KEY (`regionnr`) REFERENCES `region` (`regionnr`)
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1'

 'markt', 'CREATE TABLE `markt` (
   `marktnr` int(11) NOT NULL default '0',
   `bezeichnung` varchar(80) NOT NULL default '',
    PRIMARY KEY  (`marktnr`),
   KEY `Hauptlieferant` (`hauptlieferant`),
   CONSTRAINT `Hauptlieferant` FOREIGN KEY (`hauptlieferant`) REFERENCES `lieferant` (`lieferantnr`)
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1'


 die beiden tabellen haben nach dem erstellen schon einen fk erhalten, jetzt soll region_markt einen weiteren bekommen:

 ALTER TABLE `REGION_MARKT` ADD CONSTRAINT `Marktnr` FOREIGN KEY `Marktnr` (`Marktnr`) REFERENCES `MARKT` (`Marktnr`) ON DELETE RESTRICT ON UPDATE RESTRICT;

 als resultat bekomme ich:
 mysql error number 1005 , can't create table #sql_fd0_1.frm (errno:121)

 wieso?
 oder besser gesagt, wie loese ich dieses problem


----------



## XChris (7. April 2005)

Hallo

vorweg:

Fabforce Casetool 

hilft wie verrückt.

Hier nun etwas Schützenhilfe:
1. Vermeide bei FK bei INNODB unbedingt Altertable. Auf der MySQL Seite steht, dass Alter Table hin und wieder FK löschen .... noch. Ist bekannter Bug.
2. Immer einen INDEX auf das Feld machen, dass den FK hält
3. Referenzen dürfen nur einmal vorkommen. Also jeden FK und seine Referenz unterschiedliche Namen zuweisen!

Zu Deinem Problem:
DIe erste Tabelle verweist auf sich selbst. Das ist okay, Jedoch solltest Du sie erst mal ohne FK auf sich selbst erstellen. Das geht nehmlich nicht. Erst dann nen ALTER TBALE setzen und den FK auf sich selbst setzen. (Ja ich weiß, dass ich grad geschrieben habe, ALTER TABLE vermeiden ...)

Für INNODB finden sich einige Leute hier: SDH 

Chris


----------



## waterhouse533-lp (7. April 2005)

hallo chris,
 erstmal danke fuer die antwort. wie, wenn nicht mit alter table soll ich die fk einbauen?
 gleich beim create?


----------



## XChris (7. April 2005)

> hallo chris,
> erstmal danke fuer die antwort. wie, wenn nicht mit alter table soll ich die fk einbauen?
> gleich beim create?



Ne. geht ja (leider) gar nicht anders. Musst nen ALTER nehmen in diesem Fall. Ging es denn nun an sich?

Chris


----------



## waterhouse533-lp (8. April 2005)

noch funktioniert das nicht so wie ich will, ist aber in arbeit


----------



## XChris (8. April 2005)

Nimm mal das FabForce Tool und bei Probs schick mir dann mal die XML Datei die das Ding ausspuckt.

toxchris@gmx.de

Chris


----------

