onsdag 3 mars 2010

Problem att skapa MySQL tabeller med ENGINE=InnoDB

"PHP och MySQL.
Jag försöker skapa två tabeller med ett FOREIGN KEY constraint och jag använder ENGINE=InnoDB. Jag använder multi_query(). Jag får följande felmeddelande:

Error code: 1005 (Can't create table 'test.test_professor' (errno: 150))"
Problemet uppkommer ofta i kursen dbwebb:kmom05. Vi har haft detta problem ett tag tillbaka. Det är rimligt att det är relaterat till följande MySQL-bugg:

http://bugs.mysql.com/bug.php?id=40877 (precis som någon antyder i flashback-forumet)

Ett möjligt problem i sammanhanget är att installationsprogrammet på Windows Essentials installerar InnoDB som default storage engine. Normalt är det MyISAM som är default. Av denna anledningen så är det klart rekommenderat att explicit ange vilken storage engine som avses vid CREATE TABLE.
Dokumenterar att InnoDB är default i MySQL Essentials på Windows.
http://dev.mysql.com/doc/refman/5.1/en/innodb.html
"The Windows Essentials installer makes InnoDB the MySQL default storage engine on Windows, if the server being installed supports InnoDB."
Visa (SHOW ENGINE) vilken storage engine som för tillfället är default i din databas.
http://dev.mysql.com/doc/refman/5.0/en/show-engines.html

Jag gjorde ett testfall och testade på två olika maskiner.
Koden till testfallet på GitHub.
http://github.com/mosbth/Utility/blob/master/multiquery_foreignkey_fails_errorcode_150.php

Fails on MySQL 5.1.38 using Engine=InnoDB and multi_query().
http://dev.phpersia.org/utility/multiquery_foreignkey_fails_errorcode_150.php

Works on MySQL 5.0.51.
http://www.student.bth.se/~mos/utility/multiquery_foreignkey_fails_errorcode_150.php

För att undvika problemet så byt ut ENGINE=InnoDB till ENGINE=MyISAM.
Eller ange ENGINE=MyISAM explicit (om InnoDB är default).
Eller exekvera SQL-kommandona ett och ett med query() (istället för multi_query()).
Eller välj en MySQL version där problemet är löst (se buggrapporten för detaljer).

Enligt buggrapporten skall problemet vara löst from release 5.1.42. Se changeloggen.
"Multiple-statement execution could fail. (Bug#40877)"
http://dev.mysql.com/doc/refman/5.1/en/news-5-1-42.html
2010-04-28: Jag kan med testprogrammet återupprepa samma problem med Engine=InnoDB och multi_query() på  5.1.45 (Windows 7). Problemet kvarstår sålunda. Jag gjorde en ny sökning i MySQL bugdatabas och möjligen är följande buggrapport (en spinoff på bug#40877) en lösning på problemet.
http://bugs.mysql.com/bug.php?id=48024

Inga kommentarer:

Skicka en kommentar