【问题标题】:How to DROP a column from a table in MySQL using a column number如何使用列号从 MySQL 中的表中删除列
【发布时间】: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 列,我将如何仅使用列号来执行此操作?

【问题讨论】:

    标签: mysql handsontable


    【解决方案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。

      【讨论】:

        猜你喜欢
        • 2022-01-06
        • 2012-12-07
        • 2020-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-06
        • 2020-11-15
        相关资源
        最近更新 更多