我想编写一个 SQL 命令以在一个 ALTER TABLE
语句中从单个表中删除多个列。
从 MSDN's ALTER TABLE documentation...
DROP { [CONSTRAINT] 约束名 | COLUMN column_name } 指定从表中删除constraint_name 或column_name。如果兼容级别为 65 或更早,则不允许使用 DROP COLUMN。可以列出多个列和约束。
它说可以在语句中列出多个列,但语法不显示可选的逗号或任何甚至暗示语法的内容。
我应该如何编写我的 SQL 以在一个语句中删除多个列(如果可能)?
对于 SQL Server:
ALTER TABLE TableName
DROP COLUMN Column1, Column2;
语法是
DROP { [ CONSTRAINT ] constraint_name | COLUMN column } [ ,...n ]
对于 MySQL:
ALTER TABLE TableName
DROP COLUMN Column1,
DROP COLUMN Column2;
或像这样1:
ALTER TABLE TableName
DROP Column1,
DROP Column2;
1 COLUMN
这个词是可选的 并且可以省略,除了 RENAME COLUMN
(以区分列重命名操作和 RENAME
表重命名操作) .更多信息here。
总结
ALTER TABLE table_name DROP (column_name1, column_name2);
ALTER TABLE table_name DROP COLUMN column_name1, column_name2
ALTER TABLE table_name DROP column_name1, DROP column_name2;
ALTER TABLE table_name DROP COLUMN column_name1, DROP COLUMN column_name2;
意识到
DROP COLUMN
不会物理地删除某些 DBMS 的数据。例如对于 MS SQL。对于固定长度类型(int、numeric、float、datetime、uniqueidentifier 等) 即使在删除列后添加的记录也会消耗空间。要摆脱浪费的空间,请执行 ALTER TABLE ... REBUILD
。
COLUMN
关键字。
create table test (a int, b int , c int, d int);
alter table test drop column b, d;
请注意,DROP COLUMN 不会物理删除数据,对于固定长度类型(int、numeric、float、datetime、uniqueidentifier 等),即使在删除列后添加的记录也会消耗空间。要摆脱浪费的空间,请执行 ALTER TABLE ... REBUILD
。
ALTER INDEX PK_IndexName ON TableName REBUILD
并且它会回收空间。这在此处有所描述:msdn.microsoft.com/en-us/library/ms189858.aspx 在“重建索引”部分下。
这可能会迟到,但为访问此问题的新用户分享它。删除多列的实际语法是
alter table tablename drop column col1, drop column col2 , drop column col3 ....
因此,对于每一列,您需要在 Mysql 5.0.45 中指定“删除列”。
How should I write my SQL to drop multiple columns in one statement (if possible)?
句子的上下文表明“my”指的是作者,“SQL”指的是语言。
Microsoft 为删除 ALTER 语句的列部分指定的语法是这样的
DROP
{
[ CONSTRAINT ]
{
constraint_name
[ WITH
( <drop_clustered_constraint_option> [ ,...n ] )
]
} [ ,...n ]
| COLUMN
{
column_name
} [ ,...n ]
} [ ,...n ]
请注意,[,...n] 出现在列名之后和整个 drop 子句的末尾。这意味着有两种方法可以删除多个列。您可以这样做:
ALTER TABLE TableName
DROP COLUMN Column1, Column2, Column3
或这个
ALTER TABLE TableName
DROP
COLUMN Column1,
COLUMN Column2,
COLUMN Column3
如果要将列的删除与约束的删除结合起来,则第二种语法很有用:
ALTER TBALE TableName
DROP
CONSTRAINT DF_TableName_Column1,
COLUMN Column1;
删除列时,SQL Sever 不会回收被删除的列所占用的空间。对于内联存储在行中的数据类型(例如 int),它甚至可能占用在 alter 语句之后添加的新行的空间。为了解决这个问题,您需要在表上创建一个聚集索引,或者如果它已经有一个聚集索引,则重建它。可以在修改表后使用 REBUILD 命令重建索引。但请注意,这在非常大的桌子上可能会很慢。例如:
ALTER TABLE Test
REBUILD;
对于 MySQL(5.6 版),您不能使用单个 drop
语句执行多列删除,而是使用多个 drop
语句:
mysql> alter table test2 drop column (c1,c2,c3);
ERROR 1064 (42000): 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 '(c1,c2,c3)' at line 1
mysql> alter table test2 drop column c1,c2,c3;
ERROR 1064 (42000): 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 'c2,c3' at line 1
mysql> alter table test2 drop column c1, drop column c2, drop c3;
Query OK, 0 rows affected (0.64 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql>
顺便说一句,从上面的 drop c3
可以看出,drop <col_name>
是 drop column <col_name>
的简写。
如果只是删除以下语法的单列
ALTER TABLE tablename DROP COLUMN column1;
对于删除多个列,使用 DROP COLUMN
不起作用,以下语法有效
ALTER TABLE tablename DROP (column1, column2, column3......);
alter table tablename drop (column1, column2, column3......);
通用的:
ALTER TABLE table_name
DROP COLUMN column1,column2,column3;
例如:
ALTER TABLE Student
DROP COLUMN Name, Number, City;
因为 postgis 是
alter table table01 drop columns col1, drop col2
此查询将更改多列测试它。
create table test(a int,B int,C int);
alter table test drop(a,B);
ALTER table table_name Drop column column1, Drop column column2,Drop column column3;
对于 MySQL 数据库。
或者您可以在更改同一行时添加一些列:
ALTER table table_name Drop column column1, ADD column column2 AFTER column7;