Renaming foreign-key columns in MySQL

前端 未结 6 1889
小鲜肉
小鲜肉 2020-11-30 07:20

We\'re trying to rename a column in MySQL (5.1.31, InnoDB) that is a foreign key to another table.

At first, we tried to use Django-South, but came up against a know

相关标签:
6条回答
  • 2020-11-30 07:38

    Expanding on @Dewey's answer, here's a little script to rename FKs generated by Hibernate in a useful manner ("FK__" + table name + "__" + referenced table name).

    SELECT CONCAT(
      "alter table ", TABLE_NAME, " drop foreign key ", CONSTRAINT_NAME,";\n",
      "alter table ", TABLE_NAME, " drop key ", CONSTRAINT_NAME, ";\n",
      "alter table ", TABLE_NAME, " add key FK__", table_name, "__",
          referenced_table_name, " (", column_name, ");\n",
      "alter table ", TABLE_NAME, " add constraint FK__", table_name, "__",
          referenced_table_name , " foreign key (", column_name, ") ",
          "references ", referenced_table_name,
          "(", referenced_column_name, ");"
      ) AS runMe 
    FROM
      information_schema.key_column_usage
    WHERE 
      TABLE_SCHEMA='myschemaname' 
      AND 
      constraint_name like 'FK_%';
    

    A bit of output:

    alter table visitor_browsers drop foreign key FK_4ygermmic4fujggq1kp96dx47;
    alter table visitor_browsers drop key FK_4ygermmic4fujggq1kp96dx47;
    alter table visitor_browsers add key FK__visitor_browsers__websites (website);
    alter table visitor_browsers add constraint FK__visitor_browsers__websites foreign key (website) references websites(id);
    
    0 讨论(0)
  • 2020-11-30 07:41

    This task becomes simpler if you use GUI tools. I tried to rename ID column using IntelliJ IDEA Database tool and it worked like a charm! I don't have to bother about foreign keys when renaming a table or column.

    See more details in IntelliJ IDEA Help | Renaming items.

    MySQL 5.7

    0 讨论(0)
  • 2020-11-30 07:45

    AFAIK, dropping the constraint, then rename, then add the constraint back is the only way. Backup first!

    0 讨论(0)
  • 2020-11-30 07:46

    The following query will build the correct syntax automatically. Just execute each line returned and all your FKEYs will be gone.

    I leave the reverse (adding them back) as an exercise for you.

    SELECT CONCAT("alter table ", TABLE_NAME," drop foreign key `", CONSTRAINT_NAME,"`; ") AS runMe
    FROM information_schema.key_column_usage 
    WHERE TABLE_SCHEMA='MY_SCHEMA_NAME';
    
    0 讨论(0)
  • 2020-11-30 08:00

    In case anyone is looking for the syntax it goes something like this:

    alter table customer_account drop foreign key `FK3FEDF2CC1CD51BAF`; 
    
    alter table customer_account  add constraint `FK3FEDF2CCD115CB1A` foreign key (campaign_id) REFERENCES campaign(id);
    
    0 讨论(0)
  • 2020-11-30 08:05

    here is the SQL syntax for regular keys

    ALTER TABLE `thetable`
      DROP KEY `oldkey`, 
      ADD KEY `newkey` (`tablefield`);
    
    0 讨论(0)
提交回复
热议问题