如何使用列号从 MySQL 中的表中删除列
Posted
技术标签:
【中文标题】如何使用列号从 MySQL 中的表中删除列【英文标题】:How to DROP a column from a table in MySQL using a column number 【发布时间】:2017-07-26 21:28:29 【问题描述】:我正在尝试从与 Handsontable 一起使用的 mysql 表中删除一列。当我从 Handsontable 中删除一列时,我可以使用 afterRemoveCol()
回调获取列的索引:
afterRemoveCol: function (index, amount)
alert(index +' amount: '+amount);
我想使用此回调函数从 MySQL 表中返回的列号 (n
) 删除列,使用类似:
ALTER TABLE tbl_Blah DROP COLUMN n;
那么,如果我想从 MySQL 表中删除第 3 列,我将如何仅使用列号来执行此操作?
【问题讨论】:
【参考方案1】:要添加到 RMathis 答案,您可以在 SQL 中执行所有操作,方法是使用 SET 定义 DROP 字符串并结合PREPARE and EXECUTE
SQL Fiddle
MySQL 5.6 架构设置:
CREATE TABLE Table1
(`col1` varchar(1),
`col2` varchar(1),
`col3` varchar(1),
`col4` varchar(1),
`col5` varchar(1))
;
set @col = (select column_name
from information_schema.columns
where table_name='table1' and ordinal_position=3);
SET @s = CONCAT("alter table table1 drop column ", @col);
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
查询 1:
desc table1
Results:
| COLUMN_NAME | COLUMN_TYPE | IS_NULLABLE | COLUMN_KEY | COLUMN_DEFAULT | EXTRA |
|-------------|-------------|-------------|------------|----------------|-------|
| col1 | varchar(1) | YES | | (null) | |
| col2 | varchar(1) | YES | | (null) | |
| col4 | varchar(1) | YES | | (null) | |
| col5 | varchar(1) | YES | | (null) | |
【讨论】:
【参考方案2】:SQL 中的 SQL 可以使用 information_schema.columns 中的 ordinal_position 生成 drop 语句。
mysql test> create table test.tab (col1 char(1), col2 char(1), col3 char(1), col4 char(1), col5 char(1));
Query OK, 0 rows affected (0.01 sec)
mysql test> desc test.tab;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| col1 | char(1) | YES | | NULL | |
| col2 | char(1) | YES | | NULL | |
| col3 | char(1) | YES | | NULL | |
| col4 | char(1) | YES | | NULL | |
| col5 | char(1) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
5 rows in set (0.00 sec)
此查询正在生成删除第三列的语句...
mysql test> select concat('alter table ',table_schema,'.',table_name,' drop column ',column_name,';') as query1 from information_schema.columns where table_schema='test' and table_name='tab' and ordinal_position=3;
+----------------------------------------+
| query1 |
+----------------------------------------+
| alter table test.tab drop column col3; |
+----------------------------------------+
1 row in set (0.00 sec)
现在运行投影命令...
mysql test> alter table test.tab drop column col3;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
列定义已从表中删除。
mysql test> desc test.tab;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| col1 | char(1) | YES | | NULL | |
| col2 | char(1) | YES | | NULL | |
| col4 | char(1) | YES | | NULL | |
| col5 | char(1) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
4 rows in set (0.01 sec)
【讨论】:
成功了! “ordinal_position”是关键!我使用您建议的解决方案来简单地查询列名“WHERE ordinal_position=n”。然后,我使用结果来使用列名创建我的 DROP 语句。谢谢。【参考方案3】:用与您的电子表格完全对应的数字/字母命名它们(您的数据库中反映电子表格的列)。
然后您就可以使用常规的 ALTER TABLE ... DROP COLUMN。
【讨论】:
以上是关于如何使用列号从 MySQL 中的表中删除列的主要内容,如果未能解决你的问题,请参考以下文章
如何使用特定表中的列作为我需要从中删除、插入或更新数据的表名