FOREIGN KEXY in innodb

FOREIGN KEXY in innodb

am 09.02.2007 17:33:37 von GreenRover

Hallo, ich habe Folgende Tabellenstruktur auf einem Mysql 4.0.15

CREATE TABLE `news_kategorien` (
`id` int(6) unsigned NOT NULL auto_increment,
`parent` int(6) unsigned NOT NULL default '0',
`hide` enum('1','0') NOT NULL default '0',
`hide_b` enum('1','0') NOT NULL default '0',
`spacer` enum('1','0') NOT NULL default '0',
`menue` varchar(25) NOT NULL default '',
`orders` int(6) unsigned NOT NULL default '0',
`news_sort` varchar(50) NOT NULL default '',
`show_nesletter_form` enum('1','0') NOT NULL default '0',
`show_price` enum('1','0') NOT NULL default '0',
`ever_open` enum('1','0') NOT NULL default '0',
`highlite` enum('1','0') NOT NULL default '0',
`cut_imgs` enum('1','0','x') NOT NULL default 'x',
`thump_size` int(4) unsigned NOT NULL default '150',
`thump_size_direction` enum('w','h') NOT NULL default 'w',
`template` varchar(255) NOT NULL default '',
`tpl_file` varchar(255) NOT NULL default 'cats.tpl',
`std_bllt` int(5) unsigned NOT NULL default '0',
PRIMARY KEY (`id`),
KEY `news_kategorien1` (`parent`),
KEY `news_kategorien2` (`orders`),
KEY `news_kategorien3` (`hide`),
KEY `news_kategorien4` (`hide_b`)
) TYPE=InnoDB PACK_KEYS=1 CHECKSUM=1 DELAY_KEY_WRITE=1 AUTO_INCREMENT=293 ;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `news_news`
--

CREATE TABLE `news_news` (
`id` int(7) NOT NULL auto_increment,
`date` int(11) NOT NULL default '0',
`position` varchar(8) NOT NULL default '',
`ablaufdatum` int(11) NOT NULL default '0',
`send_abo_mail` char(1) NOT NULL default '',
`newest_news` char(1) NOT NULL default '',
`ticker_sort` varchar(255) NOT NULL default '',
`show_heading` enum('0','1') NOT NULL default '1',
`execute_php_content` enum('0','1') NOT NULL default '0',
`show_kontakt_form` enum('x','0') NOT NULL default '0',
`do_nl2br` enum('1','0') NOT NULL default '0',
`pic_to_spezial_pos` enum('1','0') NOT NULL default '0',
`kontakt_form_email` varchar(120) NOT NULL default '',
`template` varchar(255) NOT NULL default '',
`img_size` int(4) unsigned NOT NULL default '0',
`spez_img_size` int(4) unsigned NOT NULL default '0',
`von` int(6) unsigned NOT NULL default '0',
`von_type` enum('K','A') NOT NULL default 'A',
PRIMARY KEY (`id`),
KEY `news_news2` (`newest_news`,`date`),
KEY `news_news6` (`position`),
KEY `news_news7` (`date`),
KEY `news_news8` (`ablaufdatum`),
KEY `von` (`von`,`von_type`)
) TYPE=InnoDB AUTO_INCREMENT=598 ;

-- --------------------------------------------------------

--
-- Tabellenstruktur für Tabelle `news_news_kat`
--

CREATE TABLE `news_news_kat` (
`news` int(6) unsigned NOT NULL default '0',
`kat` int(6) unsigned NOT NULL default '0',
`type` enum('h','n') NOT NULL default 'h',
PRIMARY KEY (`news`,`kat`)
) TYPE=InnoDB;



Und Folger Befehl stirb mit der Meldung error: 105



ALTER TABLE `news_news_kat` ADD CONSTRAINT `kat` FOREIGN KEY (`kat`)
REFERENCES `news_kategorien`(`id`);
ALTER TABLE `news_news_kat` ADD CONSTRAINT `news` FOREIGN KEY (`news`)
REFERENCES `news_news`(`id`);

Ich habe auf der Tabelle news_news_kat habe ich auch schon einen
normalen index probiert anstatt dem PK...

Re: FOREIGN KEXY in innodb

am 09.02.2007 21:27:39 von Axel Schwenke

"Heiko (GreenRover) Henning" wrote:

> Folger Befehl stirb mit der Meldung error: 105

Wohl eher 150.

> ALTER TABLE `news_news_kat` ADD CONSTRAINT `kat` FOREIGN KEY (`kat`)
> REFERENCES `news_kategorien`(`id`);
> ALTER TABLE `news_news_kat` ADD CONSTRAINT `news` FOREIGN KEY (`news`)
> REFERENCES `news_news`(`id`);

Die FK Spalte muß den gleichen Typ haben wie die referenzierte Spalte,
außerdem muß jeweils ein Index vorhanden sein.

Wenn du Error 150 bekommst (bzw. generell einen Fehler beim Erzeugen
von FK Constraints) hilft SHOW INNODB STATUS weiter. Das zeigt u.a.
Details zu den letzten Fehlern an.


XL

Re: FOREIGN KEXY in innodb

am 10.02.2007 01:16:43 von Andreas Scherbaum

Hallo,

das nächste mal nimmst du bitte die Leerzeichen hinter den Kommentaren
weg, damit der Newsclient den Rest deines Textes nicht als eine große#
Signatur erkennt ;-)


"Heiko (GreenRover) Henning" wrote:
> Hallo, ich habe Folgende Tabellenstruktur auf einem Mysql 4.0.15

Schon mal Beileid, die Version ist nicht mehr offiziell supported.


> Und Folger Befehl stirb mit der Meldung error: 105

Schön, den Fehlertext dürfen wir jetzt also raten?

Ist es zufällig der hier?

ads@iridium:/home/ads > perror 105
OS error code 105: No buffer space available


> ALTER TABLE `news_news_kat` ADD CONSTRAINT `kat` FOREIGN KEY (`kat`)
> REFERENCES `news_kategorien`(`id`);
> ALTER TABLE `news_news_kat` ADD CONSTRAINT `news` FOREIGN KEY (`news`)
> REFERENCES `news_news`(`id`);
>
> Ich habe auf der Tabelle news_news_kat habe ich auch schon einen
> normalen index probiert anstatt dem PK...

Du brauchst in beiden Tabellen den exakt gleichen Spaltentyp, da sehe
ich einmal int(6) und einmal int(7) bei dir ...
Ausserdem brauchst du auf jeder Spalte, die in dem Foreign Key vorkommt,
einen Index. In beiden Tabellen. Keinen gemischten Index über mehrere
Spalten, einen pro Spalte.

Ist umständlich, ja ... und die Fehlermeldungen sind auch selten
aussagekräftig.


Wenn ich mir
http://dev.mysql.com/doc/refman/4.1/en/innodb-foreign-key-co nstraints.html
so durchlese und nach "150" suche, finde ich folgendes:

----- cut -----
If MySQL reports an error number 1005 from a CREATE TABLE statement, and
the error message refers to errno 150, table creation failed because a
foreign key constraint was not correctly formed. Similarly, if an
ALTER TABLE fails and it refers to errno 150, that means a foreign key
definition would be incorrectly formed for the altered table. Starting
from MySQL 4.0.13, you can use SHOW INNODB STATUS to display a detailed
explanation of the latest InnoDB foreign key error in the server.
----- cut -----


Bye

--
Andreas 'ads' Scherbaum
Failure is not an option. It comes bundled with your Microsoft product.
(Ferenc Mantfeld)

Re: FOREIGN KEXY in innodb

am 10.02.2007 03:36:15 von GreenRover

Axel Schwenke schrieb:
>> Folger Befehl stirb mit der Meldung error: 105
>
> Wohl eher 150.
Sorry, habe mich leider vertippt.. meinte wirklich error 150
Die komplette Meldung:

#1005 - Can't create table './usr_web302_1/#sql-3d6_7513e.frm' (errno: 150)


>> ALTER TABLE `news_news_kat` ADD CONSTRAINT `kat` FOREIGN KEY (`kat`)
>> REFERENCES `news_kategorien`(`id`);
>
> Die FK Spalte muß den gleichen Typ haben wie die referenzierte Spalte,
> außerdem muß jeweils ein Index vorhanden sein.
Beide Tabellen, haben INT(6) UNSIGNED als Datentype auf diese spalter.
Es liegt auf beiden ein Primary Key.

Es geht jedoch, wenn auf der Zwischentabelle news_news_kat ein
einzelnder idex auf der spalte kat liegt...
aber sollte es nicht auch mit einem index gehen, der über beide spalten
(kat, news) liegt?
>
> Wenn du Error 150 bekommst (bzw. generell einen Fehler beim Erzeugen
> von FK Constraints) hilft SHOW INNODB STATUS weiter. Das zeigt u.a.
> Details zu den letzten Fehlern an.
Die Ausgabe sagt: http://nopaste.php-q.net/274685