在MySQL中,在特定列之后添加多个列

486

我需要给一个表格添加多列,但是要把这些列定位在名为lastname的列之后

我已经尝试过这个方法:

ALTER TABLE `users` ADD COLUMN
(
    `count` smallint(6) NOT NULL,
    `log` varchar(12) NOT NULL,
    `status` int(10) unsigned NOT NULL
) 
AFTER `lastname`;

我遇到了这个错误:

您的SQL语法有误,请参考适用于您的MySQL服务器版本的手册,查看如何在第7行使用AFTER lastname 之后的内容


我该如何在这样的查询中使用AFTER?


6
你说的是什么方言?看起来像是mysql。但ALTER TABLE语法在方言之间会有些不同。 - Damien_The_Unbeliever
1
我认为你需要在每个要添加的列上加上AFTER关键字。无论是需要所有3个列都放在lastname之后,还是每个新列都需要单独的ALTER TABLE语句,我不能确定。 - Zec
11个回答

932

试试这个

ALTER TABLE users
ADD COLUMN `count` SMALLINT(6) NOT NULL AFTER `lastname`,
ADD COLUMN `log` VARCHAR(12) NOT NULL AFTER `count`,
ADD COLUMN `status` INT(10) UNSIGNED NOT NULL AFTER `log`;

请检查语法


17
作为一个额外的信息,可以在一个ALTER TABLE语句中使用多个ADDALTERDROPCHANGE子句,用逗号分隔。这是MySQL对标准SQL的扩展,标准SQL每个ALTER TABLE语句只允许使用每种子句一次。 - informatik01
@Ayyappan 我们可以在SQL服务器中做这个吗? - Roshan
在BigQuery中的等效物是什么? - Oussama Bamaàrouf
不错。我可以建议,如果您不想每次使用原始列后指定不同的最后一列,但是将列以相反的顺序放置在查询中,以便按所需顺序显示它们。 - Sarfaraaz

94

如果你想在特定字段后添加一列,那么以下 MySQL 查询应该可以实现:

ALTER TABLE users
    ADD COLUMN count SMALLINT(6) NOT NULL
    AFTER lastname

如果您想添加多个列,则每次需要使用“ADD”命令添加一列。以下是此操作的MySQL查询:

ALTER TABLE users
    ADD COLUMN count SMALLINT(6) NOT NULL,
    ADD COLUMN log VARCHAR(12) NOT NULL,
    ADD COLUMN status INT(10) UNSIGNED NOT NULL
    AFTER lastname

注意事项

在第二种方法中,最后的ADD COLUMN 应该实际上是你想要附加到表格中的第一列。

例如:如果你想要在lastname之后按照精确顺序添加countlogstatus,则语法实际上应该是这样的:

ALTER TABLE users
    ADD COLUMN log VARCHAR(12) NOT NULL AFTER lastname,
    ADD COLUMN status INT(10) UNSIGNED NOT NULL AFTER lastname,
    ADD COLUMN count SMALLINT(6) NOT NULL AFTER lastname
    

5
第二个版本对我来说运行得非常好。我使用的是 MySql 5.5.25 版本。 - Norman
最后一段代码是按照 countlogstatus 的顺序添加列,还是按照 countstatuslog 的顺序添加列? - Sarfaraaz
1
请注意:如果您没有添加“AFTER lastname”部分,则在该ALTER TABLE列表中放置的最后一列的顺序实际上并不适用于首先出现的列。因此,当您执行ALTER TABLE table ADD COLUMN blah1,ADD COLUMN blah2;(请注意没有“AFTER”子句)时,列blah1将首先被追加,然后是blah2。 - Hongyi Li
在BigQuery中的等效物是什么? - Oussama Bamaàrouf
第二种方法不起作用。它导致 countlog 被添加为最后一列。但是,在“注意点”中,那里的语法确实有效:对于每个 ADD COLUMN,您需要一个 AFTER 子句。 - Jake

11

这个是正确的:

ALTER TABLE `users`
    ADD COLUMN `count` SMALLINT(6) NOT NULL AFTER `lastname`,
    ADD COLUMN `log` VARCHAR(12) NOT NULL AFTER `count`,
    ADD COLUMN `status` INT(10) UNSIGNED NOT NULL AFTER `log`;

1
这段代码等同于顶部答案。请编辑您的答案以描述在您的情况下有何不同及原因,否则它是多余的。 - Melebius

11

您不能使用逗号在 ADD COLUMN 中同时提及多个列名。 每次定义新列时都需要提及 ADD COLUMN


5
我给了一个 +1,但这应该是对被接受答案的评论。 - mjsarfatti
你可以使用ALTER TABLE 'tablename' ADD ('field1' TEXT, 'field2' TEXT)来添加字段,但是似乎不能使用AFTER子句。 - Jake

10

或者:

ALTER TABLE users
ADD COLUMN `status` INT(10) UNSIGNED NOT NULL AFTER `lastname`,
ADD COLUMN `log` VARCHAR(12) NOT NULL AFTER `lastname`,
ADD COLUMN `count` SMALLINT(6) NOT NULL AFTER `lastname`;

将它们按照您想要的顺序排序,并简化"after"语句。


3
ALTER TABLE `users` ADD COLUMN
`COLUMN NAME` DATATYPE(SIZE) AFTER `EXISTING COLUMN NAME`;

你可以用这个工具来实现,对我来说运作良好。

OP想要使用单个SQL查询添加多个列,而不仅仅是一个,并且使用AFTER关键字。 - Jake

1

一种可能的做法是不去重新排列表格中的列,而是通过添加列来修改它。然后,创建一个视图,使其具有您想要的顺序 -- 假设顺序确实很重要。可以轻松更改视图以反映任何您想要的排序。由于我无法想象顺序对编程应用程序很重要,因此该视图应足以满足那些可能很重要的手动查询。


4
如果我可以发表一下自己的看法,"放置位置",无论是在表格的列还是行中,都应该不重要。电子表格使用位置来查找事物,而数据库则不然。 - Mike S.

0

我已经编写了这段代码,以防有人遇到像我一样需要快速添加大量字段的问题,希望它能帮到你。如果你太忙了,也可以在任何在线PHP编译器上运行此代码!

$fields = array(

        'col_one' ,
        'col_two' ,
        'col_three'

    );

    $startF = 'after_col';
    $table = 'table_name';

    $output = 'ALTER TABLE ' .$table.'<br>';
    for($i=0 ; $i<count($fields) ; $i++){
        if($i==0){
            $output.= 'ADD COLUMN '.$fields[$i].' VARCHAR(15) AFTER '.$startF.',' . '<br>';

        }else{
            $output.= 'ADD COLUMN '.$fields[$i].' VARCHAR(15) AFTER '.$fields[$i-1].',' . '<br>';

        }
    }

// 没有数组的额外字段

    $output.= 'ADD COLUMN col_four VARCHAR(255) AFTER any_col_u_want,  '. '<br>';
    $output.= 'ADD COLUMN col_five VARCHAR(255) AFTER col_four,  '. '<br>';
    $output.= 'ADD COLUMN col_six VARCHAR(255) AFTER col_five'. '<br>';



    echo $output;

0

修改表 listing,添加 count INT(5),添加 log VARCHAR(200),添加 status VARCHAR(20) 在 stat 后面。

这将产生良好的结果。


这个不起作用。只有在stat之后立即添加了status。其他列是在最后添加的。 - Jake

-1

对于默认值为0的情况,以下解决方案适用于我:

ALTER TABLE reservations ADD COLUMN isGuest BIT DEFAULT 0

OP想在特定列之后添加多个列。您的答案没有添加多个列,也没有在另一列之后立即添加列。 - Jake

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