在修改表结构时,多次改变列的语法错误?

3

我想修改一个像这样的表:

ALTER TABLE book 
    ADD COLUMN `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP AFTER `id`,
    CHANGE COLUMN `id` bigint unsigned NOT NULL AUTO_INCREMENT,
    CHANGE COLUMN `author_id` bigint unsigned NOT NULL;

但它一直提示语法错误:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'bigint unsigned NOT NULL AUTO_INCREMENT, CHANGE COLUMN `author_id` bigint un' at line 3

我不知道我在这里做错了什么。对我来说,SQL似乎很好,并且每个表的修改都可以成功执行:

ALTER TABLE book ADD COLUMN `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP AFTER `id`;
ALTER TABLE book CHANGE COLUMN `id` bigint unsigned NOT NULL AUTO_INCREMENT;
ALTER TABLE book CHANGE COLUMN `author_id` bigint unsigned NOT NULL;

我可以使用单独的版本,但是有一些很大的表需要修改,因此最好使用一个结合查询,应该会更快。

为什么组合的SQL不起作用?

1个回答

1
问题出在你下面的代码行,因为根据文档中的语法,CHANGE需要一个新的列名,例如CHANGE [COLUMN] old_col_name new_col_name column_definition。请注意,保留html标签。
CHANGE COLUMN `id` bigint unsigned NOT NULL AUTO_INCREMENT,

所以你可以将其更改为:
CHANGE COLUMN `id` `new_id` bigint unsigned NOT NULL AUTO_INCREMENT,

(或者) 考虑使用 MODIFY,类似于 MODIFY [COLUMN] col_name column_definition

MODIFY [COLUMN] `id` bigint unsigned NOT NULL AUTO_INCREMENT

这是标准SQL的MySQL扩展,每个ALTER TABLE语句只允许一个子句。例如,要在单个语句中删除多个列,请执行以下操作:-- 这似乎是答案?单个ALTER TABLE查询只能包含1种类型的列更改? - datasn.io
@kavoir.com,是的,每个alter table语句只能进行一项添加/更改/删除操作,不能合并。请仔细检查语法,您会发现这一点。 - Rahul
@kavoir.com,请查看答案编辑以获得更好的澄清。 - Rahul
这真的很奇怪。我尝试了一下,它居然起作用了!-- ALTER TABLE sub_subject ADD tstimestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP AFTERid, MODIFY idbigint unsigned NOT NULL AUTO_INCREMENT, CHANGEsubject subject_id bigint unsigned NOT NULL; - datasn.io
@kavoir.com,我必须用半睡眼回答了...如果有帮助,请查看回答中的编辑。 - Rahul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接