Sqlite ALTER TABLE - 在现有列之间添加列?

时间:2014-06-29 15:59:22

标签: sql performance sqlite alter-table

如果我有一个包含列的表:a,b,c和更高版本我执行ALTER TABLE命令添加新列" d",是否可以在a和b之间添加它,例如,而不是最后?

我听说列的位置会影响性能。

3 个答案:

答案 0 :(得分:8)

使用SQLite中的ALTER TABLE语句在两个现有列之间添加列是不可能的。这works as designed

  

新列始终附加到现有列表的末尾   列。

据我所知,MySQL是唯一允许你determine the placement of new columns的SQL(ish)dbms。

  

要在表格行中的特定位置添加列,请使用FIRST   或者在col_name之后。默认是最后添加列。你也可以   在CHANGE或MODIFY操作中使用FIRST和AFTER重新排序列   在一张桌子里。

但这不是我经常使用的功能,所以“据我所知”并不是很远。

答案 1 :(得分:1)

对于每个sql平台,我已经看到了唯一的方法是删除表并重新创建它。

然而,我怀疑专栏的位置是否会影响表现......你会采用什么方式做什么,你认为它会产生什么影响呢?


我还要注意,放下桌子并重新创建它往往不是一个沉重的举动。在所有主要平台上进行表的备份和恢复该表都很容易,因此编写备份 - 删除 - 创建 - 还原脚本对于有能力的DBA来说是一件容易的事。

事实上,当用户提出要求时,我经常这样做 - 但我总觉得它有点傻。给出的最常见原因是,当按特定顺序创建列时,选择工具的行为会更好。 (这也是@ Jarad的原因如下)所以这对工具制造商来说是一个很好的教训,让你的工具能够重新排序列(并在运行之间记住它) - 然后每个人都很高兴。

答案 2 :(得分:0)

我使用DB.compileStatement:

    sql = DB.compileStatement("INSERT INTO tableX VALUES (?,?,?);
    sql.bindString(1,"value for column 1");
    sql.bindString(2,"value for column 2");
    sql.bindString(3,"value for column 3");
    sql.executeUpdateDelete();

如果列的顺序不正确,那么会有很大的不同。 不幸的是,使用ALTER TABLE无法在特定位置添加列,至少在SQLite中是这样。 (MySQL是可能的)。 Workaroud正在重新创建表..(以及备份和恢复数据)