我应该如何编写用于更改数据库模式的大型SQL脚本?

时间:2011-11-14 11:34:39

标签: mysql sql database database-design

我基本上从一个带有一些数据的WordPress数据库转储MySQL。整个转储大约是20MB,大约有500个查询,所以它不需要永远加载,但它也不是超快。

我需要在我的其他应用程序中使用该数据库,为此,我必须更改架构,即重命名表,列,删除一些列,删除表,创建新表并将数据导入其中等。

实际上,我几乎要改变每一列。问题是,我该如何编写这样的脚本?

我希望能够拥有一个可以在最近的转储上执行的脚本,它将数据库转换为所需的形式。这意味着如果我开始键入ALTER TABLE查询然后执行它们,我将不得不每次要测试整个脚本时重新导入数据库,这对我来说似乎不太有效。有没有更好的方法呢?

我可以以某种方式运行一堆查询,看看他们做了什么,然后按一个按钮将数据库移回原来的状态?

3 个答案:

答案 0 :(得分:3)

我不是100%肯定我理解你的问题,但我认为你可能正在寻找

CREATE TABLE new_table LIKE other_database.old_table;

这将允许您保持旧数据库的“规范”版本不受影响。您的ALTER TABLE语句将针对新表执行。

除了能够将整个脚本作为单个事务运行之外,对于这些类型的架构更改,没有简单的亚毫秒UNDO。

说了这么多,如果一位开发人员来找我并说“我要经常改变几乎每一根柱子”,我会把它看作一个大红旗,在风中滚滚。

答案 1 :(得分:0)

如果修改基础数据集似乎对您无效,您可以构建一个抽象层。表的主要抽象机制是视图。您可以构建一组视图,用于在导入的数据库上投影应用程序所需的数据集的形状。这种方法几乎可以保证在运行时比在物理上改变底层数据集时表现更差。您还需要了解在MySQL中创建和使用视图的限制。如果没有具体的具体情况,很难给出具体的答案。

也就是说,对于alter table语句的大脚本,没有任何内在的无效。

  

我可以以某种方式运行一堆查询,看看他们做了什么,然后   点击一个按钮将数据库移回原来的状态?

不通过交易,我不相信。您只需重新恢复数据库即可。

答案 2 :(得分:0)

你想要实现的目标将更好地描述为ETL任务而不是一堆“ALTER TABLES”。不要改变旧模式 - 然后单独创建新模式 将数据导入其中,随时改变格式,如此

INSERT INTO NEWTABLE (Fullname)
SELECT CONCAT(Name, Surname) AS FullName FROM  OLDTABLE