2017-09-30 95 views

回答

1

其他人都毫不含糊地回答: “不,这是不可能的。”这是你的字面问题的答案。但我想知道为什么你问这个问题。

MySQL最大的难点之一就是使用ALTER TABLE锁定表格,而您正在进行像添加列这样的更改,并且表格中的数据越多,重新构建表格的时间越长。我猜这是你的问题,并且你正在尝试获得一个替代方案,在添加新列时不会阻止对表的访问。

(。在将来,它会帮助人们给你最好的答案,如果你解释一下你正在试图做什么)

的这个问题的答案是肯定的,有一个解决方案:pt-online-schema-change是一个免费的工具,可以完成这件事。

您可以像使用ALTER TABLE一样使用它,但可以在命令行而不是SQL查询中使用它。

pt-online-schema-change --alter "ADD COLUMN c1 INT" D=sakila,t=actor 

在此示例中,数据库名称为sakila和表名是actor。该脚本做了很多工作在幕后:

  • 创建像原来表的表,但空行的
  • ALTER TABLE来添加列或任何其他改变你告诉它。你可以做任何你通常用ALTER TABLE做的事情。实际上,它正在为你做ALTER TABLE,而不是空副本表。
  • 将原始表中的行复制到后台的新表中。
  • 创建触发器以捕获对原始表进行的任何更改,同时逐渐复制大量数据。
  • 所有数据都被复制后,交换新表(带额外的列)和原始表的名称。
  • 放下原始表格。

这有几点注意事项,就像原始表必须有一个主键,并且不能有现有的触发器。

它比传统的ALTER TABLE需要更长的时间,但由于它不阻止对原始表的访问,所以它更方便。

这有帮助吗?

+0

非常感谢您的回复。 –

+0

实际上,这个问题是在面试中问我的。面试官问我是否执行alter语句的处理时间超过了大表号的加载时间。的列,可以使用替代alter语句的替代方法向表中添加新列。我对面试官的回答与上面提到的相似,只是需要进一步澄清。 –

2

是否可以在不使用alter语句的情况下将新列添加到现有表中?

相关问题