【发布时间】:2014-06-29 15:59:21
【问题描述】:
如果我有一个包含以下列的表:a、b、c,然后我执行 ALTER TABLE 命令来添加一个新列“d”,例如,是否可以在 a 和 b 之间添加它,而不是在结束了吗?
听说列的位置会影响性能。
【问题讨论】:
-
列的位置对性能的影响基本为零。
标签: sql performance sqlite alter-table
如果我有一个包含以下列的表:a、b、c,然后我执行 ALTER TABLE 命令来添加一个新列“d”,例如,是否可以在 a 和 b 之间添加它,而不是在结束了吗?
听说列的位置会影响性能。
【问题讨论】:
标签: sql performance sqlite alter-table
不能在 SQLite 中使用 ALTER TABLE 语句在两个现有列之间添加列。这个works as designed。
新列总是附加到现有列表的末尾 列。
据我所知,MySQL 是唯一可以让您determine the placement of new columns 的 SQL (ish) dbms。
要在表格行中的特定位置添加列,请使用 FIRST 或在 col_name 之后。默认是最后添加列。你也可以 在 CHANGE 或 MODIFY 操作中使用 FIRST 和 AFTER 对列进行重新排序 在一个表中。
但这不是我经常使用的功能,所以“据我所知”并不是很远。
【讨论】:
对于我见过的每个 sql 平台,唯一的方法就是删除表并重新创建它。
但是,我质疑列的位置是否会影响性能......它会以什么方式,你正在做什么操作,你认为它会有所作为?
我还会注意到,放下桌子并重新创建它通常不是一件繁重的事情。在所有主要平台上备份表并恢复该表都很容易,因此编写备份-删除-创建-恢复脚本对于有能力的 DBA 来说是一件容易的事。
事实上,当用户询问时,我经常这样做——但我总是觉得这有点傻。给出的最常见原因是,当以特定顺序创建列时,选择的工具会表现得更好。 (这也是@Jarad 下面的原因)所以这对工具制造商来说是一个很好的教训,让你的工具能够重新排序列(并在运行之间记住它)——然后每个人都很高兴。
【讨论】:
我使用 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 正在重新创建表..(以及备份和恢复数据)
【讨论】: