[ 
https://issues.apache.org/jira/browse/DDLUTILS-268?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Colin Ritchie updated DDLUTILS-268:
-----------------------------------

    Attachment: DDLUTILS-268.diff

Here is a fix for DDLUTILS-268.  What I have done is:

Since MyISAM databases store a FK as an Index, the MySQL Modeler method 
findCorrespondingIndex() will look for a corresponding ForeignKey with the same 
name, and findCorrespondingForeignKey() will look for a corresponding Index 
with the same name.

> Detect foreign keys on MySQL MyISAM showing up as indexes 
> ----------------------------------------------------------
>
>                 Key: DDLUTILS-268
>                 URL: https://issues.apache.org/jira/browse/DDLUTILS-268
>             Project: DdlUtils
>          Issue Type: Improvement
>          Components: Core - MySql
>            Reporter: Eirik Bjorsnos
>            Assignee: Thomas Dudziak
>         Attachments: DDLUTILS-268.diff
>
>
> When reading a MyISAM MySQL database model from the database, DdlUtils will 
> read in Index instead of a ForeignKey.
> As a result of this, DdlUtils suggests to remove the index and create the 
> foreign key. After applying this change, DdlUtils will still not see the 
> ForeignKey and thus suggests the same change all over again.
> We work around this by looking for all indexes in a table. If we find an 
> equally named foreign key in our "wanted" model, we remove the index and add 
> a foreign key:
> {code}
> public void transform(Database database, Database wanted, Platform platform) {
>         if (platform instanceof MySqlPlatform) {
>             for (Table table : database.getTables()) {
>                 for (Index index : table.getIndices()) {
>                     Table wantedTable = wanted.findTable(table.getName());
>                     if (wantedTable != null) {
>                         ForeignKey key = 
> findCandidateForeignKey(platform.getSqlBuilder(), index, wantedTable);
>                         if (key != null) {
>                             table.removeIndex(index);
>                             table.addForeignKey(new CloneHelper().clone(key, 
> table, database, true));
>                         }
>                     }
>                 }
>             }
>         }
>     }
> {code}
> After this transformation,  DdlUtils will not suggest removing the index and 
> adding the foreign key.
> If this something that could be added to DdlUtils proper in some way?
> Here's the DB I used for testing this:
> {code}
> <database name="ddlutils-db" xmlns="http://db.apache.org/ddlutils/schema/1.1";>
>     <table name="orderTable">
>         <column name="orderId" primaryKey="true" required="true" 
> type="INTEGER" size="10" autoIncrement="true"/>
>         <column name="CustomerName" required="false" type="VARCHAR" 
> size="64"/>
>     </table>
>     <table name="orderLine">
>         <column name="orderLineId" primaryKey="true" required="true" 
> type="INTEGER" size="10" autoIncrement="true"/>
>         <column name="orderId" required="true" type="INTEGER" size="10"/>
>         <foreign-key foreignTable="orderTable">
>             <reference local="orderId" foreign="orderId"/>
>         </foreign-key>
>     </table>
> </database>
> {code}

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to