mysql 4.1.10 foreign keys

waterhouse533-lp

Erfahrenes Mitglied
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
 
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
 
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
 

Neue Beiträge

Zurück