On 3/5/07, Paul Balomiri <[EMAIL PROTECTED]> wrote:
I encountered a problem using ddlutils with mysql. Starting point was an export done from a life table created with this Script: ------------------------------------ CREATE TABLE A (a INTEGER(11) , b1 VARCHAR(255), b2 VARCHAR(255), PRIMARY KEY (a) ) ; ------------------------------------- A flat xml export from the life database yielded this xml output for table A ----------------------------------------- <table name="A"> <column name="a" primaryKey="true" required="true" type="INTEGER" size="11" default="0" autoIncrement="false"/> <column name="b1" primaryKey="false" required="false" type="VARCHAR" size="255" autoIncrement="false"/> <column name="b2" primaryKey="false" required="false" type="VARCHAR" size="255" autoIncrement="false"/> <index name="PRIMARY"> <index-column name="a"/> </index> </table> ---------------------------------------------- The SQL generated by the SqlBuilder class contained an extra line CREATE INDEX PRIMARY on A(a); which was rejected by the Mysql Engine because PKs cannot be created using CREATE statements since mysql 4.1 (see http://bugs.mysql.com/bug.php?id=6062 ). thus the problem is twohand: 1) When creating a Table the and using PRIMARY KEY(a) within the CREATE TABLE statement, the external statement CREATE INDEX PRIMARY... is invalid. 2) If a primary Index is to be added after table creation, one cannot use the CREATE INDEX PRIMARY ... statement. One must instead use the form ALTER TABLE A ADD PRIMARY KEY (a). PRIMARY, on the other hand is not a valid INDEX name, thus it is true that all indexes called PRIMARY must be PKs. There seems to be a difference in mysql between PK and indexes in general. Concluding from 2 I think it is safe to assume that all indexes called 'PRIMARY' from DdlUtils are in fact Primary Keys. Based on this assumption an overloaded version of writeExternalIndicesCreateStmt replaces the SQL output for indexes called 'PRIMARY' with the Alter Table form. Even using this form the index creation is not valid, as the key is duplicate. So I also overloaded the createTable statement, to call a version of writeExternalIndicesCreateStmt which omits the Indexes called 'Index'
What is odd is that AFAICS the code does use an CREATE INDEX PRIMARY statement at all, it uses a ALTER TABLE ADD CONSTRAINT statement. And also, all unit tests pass on both MySQL 4.1 and 5.0. Could you please check whether you run the latest version of the code ? If yes, then please create an issue in JIRA and attach the patch there. thanks, Tom