【问题标题】:Sqlite ALTER TABLE - add column between existing columns?Sqlite ALTER TABLE - 在现有列之间添加列?
【发布时间】:2014-06-29 15:59:21
【问题描述】:

如果我有一个包含以下列的表:a、b、c,然后我执行 ALTER TABLE 命令来添加一个新列“d”,例如,是否可以在 a 和 b 之间添加它,而不是在结束了吗?

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

【问题讨论】:

  • 列的位置对性能的影响基本为零。

标签: sql performance sqlite alter-table


【解决方案1】:

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

新列总是附加到现有列表的末尾 列。

据我所知,MySQL 是唯一可以让您determine the placement of new columns 的 SQL (ish) dbms。

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

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

【讨论】:

    【解决方案2】:

    对于我见过的每个 sql 平台,唯一的方法就是删除表并重新创建它。

    但是,我质疑列的位置是否会影响性能......它会以什么方式,你正在做什么操作,你认为它会有所作为?


    我还会注意到,放下桌子并重新创建它通常不是一件繁重的事情。在所有主要平台上备份表并恢复该表都很容易,因此编写备份-删除-创建-恢复脚本对于有能力的 DBA 来说是一件容易的事。

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

    【讨论】:

    • 我不是专业的程序员,但我非常注重按逻辑顺序对事物进行分组。对我来说,尽管列在表中的位置在性能上没有区别,但我更喜欢功能相似的列彼此相邻。例如,假设您在表中有一个用户友好的字符串名称和一个字符串的内部名称(2 列)。使用 DB Browser for SQLite 等数据库浏览工具时,将它们并排分组是有利的。而不是必须查看表格的一侧,然后水平滚动到另一侧,将它们放在一起。
    • @jarad 当然我理解为什么有人会希望列按特定顺序排列,您知道可以在 select 语句中更改列的顺序吗?
    【解决方案3】:

    我使用 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 正在重新创建表..(以及备份和恢复数据)

    【讨论】:

      猜你喜欢
      • 2011-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多