【问题标题】:Trying to better understand MySQL ALTER syntax试图更好地理解 MySQL ALTER 语法
【发布时间】:2015-04-23 20:14:53
【问题描述】:

我正在通过阅读“Head First SQL”一书来学习 MySQL,但我遇到了障碍。我似乎无法理解下面的代码。具体来说,我有几个问题。

  • 当我尝试在控制台(Wamp 上的 MySQL)上运行整个代码时,出现多个错误。但是,当我将每个 ALTER 命令(例如 ALTER table_name RENAME TO new_table_name;)分开时,大部分代码都会毫无问题地通过控制台。这是为什么?根据这本书,整个代码应该可以工作。

  • 我在单独复制/粘贴代码时遇到的一个错误与排序有关,例如“FIRST”、“SECOND”、“AFTER”等。为什么会发生这种情况?

  • 最后,为什么有些 ALTER 命令,例如 RENAME 和 ADD COLUMN 需要 ALTER TABLE table_name,而其他命令,例如 CHANGE 或修改列不?这本书没有很好地解释这方面的任何内容,所以我很好奇为什么允许我用一些但不是所有的代码来做这件事。

我遇到的错误可能是代码过时的结果吗?这本书出版于 2007 年,所以我不确定代码是否过时。

非常感谢所有和任何建议。感谢您的时间!

代码: ALTER TABLE 表名 重命名为 new_table_name,

ALTER TABLE new_table_name
ADD COLUMN column1 INT NOT NULL AUTO_INCREMENT FIRST, 

ADD PRIMARY KEY(column1), 

ALTER TABLE new_table_name
ADD COLUMN column2 VARCHAR(16) SECOND, 

CHANGE COLUMN column3 new_column3 VARCHAR(20), 
MODIFY COLUMN column4 AFTER column3, 

MODIFY COLUMN column5 SIXTH, 

CHANGE COLUMN column6 DECIMAL(7,2);

【问题讨论】:

  • ALTER 语句之间需要分号(终止符)我认为
  • @Ejay 不,他们没有。您可以在单个语句中对同一个表运行多个 ALTER,实际上这样做通常是有益的。
  • @duskwuff:是的,您可以在一个 alter 中更改多个字段,但如果您有多个 alter 语句(或任何其他语句),则需要 ;。例如alter table1 field1_stuff, field2_stuff, etc... 与alter table1 field1stuff; alter table1 field2_stuff.

标签: mysql alter


【解决方案1】:

您正在使用的示例代码已损坏。 ADD COLUMN、CHANGE COLUMN 和 MODIFY COLUMN 的 FIRST 关键字是一种特殊情况;例如,没有类似的 SECOND 关键字。第一列之外的列必须改为属于 AFTER another_column。

此外,由于某种原因,第二个ALTER TABLE 已插入此语句的中间。实际语法中没有这种不一致;这只是你书中的一个错误。

最后,MODIFY COLUMN 更改必须包含列的新类型。 (如果ALTER的目标只是将列移动到表中的另一个位置,可以指定列的当前类型。)

The official documentation for the ALTER TABLE command 值得一读。很长,但是很详细。 (而且,更好的是,它正确。)

这是查询的更正版本,带有 cmets。请注意,我没有在真实表上测试过这个查询,所以我不确定它是否完全正确。 (特别是,我将column4 和column5 的类型保留为SOME_TYPE,因为我不知道它们的类型应该是什么。)

ALTER TABLE new_table_name
    ADD COLUMN column1 INT NOT NULL AUTO_INCREMENT FIRST, 
    ADD PRIMARY KEY(column1), 
    ADD COLUMN column2 VARCHAR(16) AFTER column1,  -- no extra ALTER; not SECOND
    CHANGE COLUMN column3 new_column3 VARCHAR(20),
    MODIFY COLUMN column4 SOME_TYPE AFTER new_column3, -- need type, and must
                                                       -- use new column name
    MODIFY COLUMN column5 SOME_TYPE AFTER column4, -- not SIXTH
    CHANGE COLUMN column6 DECIMAL(7,2);

【讨论】:

  • 哇,这实际上是非常好的信息。谢谢你。为了清楚起见, SOME_TYPE 将是数据类型,对吧?另外,空白行是什么——使用新的列名?
  • @Mike 只是为了防止编辑器创建滚动条-您可以这样阅读:need type, and must use new column name。
  • @Mike 正确; SOME_TYPE 是 column4 和 column5 的当前类型的占位符。而且,正如 DominikAngerer 所说,空白行只是为了让我的评论合适;它没有功能意义。
【解决方案2】:
  • 使用分号分隔语句;
  • 注意依赖于前一个结果的语句。

【讨论】:

    猜你喜欢
    • 2011-12-29
    • 2016-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-05
    • 2012-01-14
    • 2020-12-19
    • 2023-03-26
    相关资源
    最近更新 更多