MySQL - 大规模的结构变化

时间:2014-09-25 23:58:01

标签: mysql

我正在使用一个数据库,该数据库几乎在每个表中都引用了#34; user"用于跟踪上次创建或更新记录的人员的表。不幸的是,用户表的主键是"用户名"而不是自动递增的id。我们经常出现由于拼写错误或用户配置文件中的更改而需要更改用户名的情况,而且在当前设计下这非常耗时。

我想更改结构以使用自动递增的ID,但我找不到一种简单的方法。在SqlServer中,我可以在引用,游标和结构更改上结合使用内省,而不需要太多努力。但是从我读过的关于MySQL的内容来看,I(1)只能使用来自存储过程的WITHIN循环,(2)只能从存储过程的OUTSIDE中改变结构。

我发现的唯一选择是相当繁琐的任务 (1)创建临时表以查找对用户名的引用:

CREATE TEMPORARY TABLE IF NOT EXISTS username_refs as (select table_name, column_name, constraint_name, referenced_table_name, referenced_column_name from information_schema.key_column_usage where REFERENCED_TABLE_NAME = 'user' and referenced_column_name = 'username');

(2)构建一组SQL语句来完成每项任务。例如,这会创建一个"阴影"每个表上引用用户名的列:

select CONCAT('ALTER TABLE `', table_name, '` ADD COLUMN `', column_name,'_2` bigint(20) ;') from username_refs;

这最终会成为数百行的sql。是否有一种更容易实现这一目标的方法,我只是缺席了?

1 个答案:

答案 0 :(得分:0)

有些人更喜欢用外部语言编写脚本来循环表格并格式化所需的ALTER TABLE语句。例如,您喜欢Perl,Ruby,PHP,Python等。每种脚本语言都支持访问MySQL的API。

你做的也很好。您可以使用SQL生成ALTER语句列表,将其输出保存到文件中,然后将该文件作为SQL脚本运行。

顺便说一下,您不一定需要单独的自动增量键。您将外键定义为username以便ON UPDATE CASCADE。请参阅https://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html

中的“参考操作”