【问题标题】:How to add a new column in a View in sqlite?如何在 sqlite 的视图中添加新列?
【发布时间】:2012-09-15 08:43:09
【问题描述】:

我在 sqlite (table1) 中有这个数据库:

+-----+-------+-------+
| _id | name  | level |
+-----+-------+-------+
| 1   | Mike  | 3     |
| 2   | John  | 2     |
| 3   | Bob   | 2     |
| 4   | David | 1     |
| 5   | Tom   | 2     |
+-----+-------+-------+

我想创建一个包含所有级别 2 元素的视图,然后添加一个新列来指示新表中行的顺序。也就是说,我想要这个结果:

+-------+------+
| index | name |
+-------+------+
| 1     | John |
| 2     | Bob  |
| 3     | Tom  |
+-------+------+

我试过了:

CREATE VIEW words AS SELECT _id as index, name FROM table1;

然后我得到:

+-------+------+
| index | name |
+-------+------+
| 2     | John |
| 3     | Bob  |
| 5     | Tom  |
+-------+------+

我想应该是这样的:

CREATE VIEW words AS SELECT XXXX as index, name FROM table 1;

我应该使用什么来代替 XXXX?

【问题讨论】:

  • 为什么需要无孔的订单栏?

标签: sqlite view


【解决方案1】:

当按_id 排序时,直到并包括这一行的行数与_id 值小于或等于该行的_id 的行数相同:

CREATE VIEW words AS
  SELECT (SELECT COUNT(*)
          FROM table1 b
          WHERE level = 2
            AND b._id <= a._id) AS "index",
         name
  FROM table1 a
  WHERE level = 2;

(计算本身实际上并不需要ORDER BY _id,因为当我们只计算它们时,行的顺序并不重要。)

请注意,words 不保证排序;如果需要,请添加ORDER BY "index"。


当然,这不是很有效。

【讨论】:

    【解决方案2】:

    你有两个选择。首先,您可以简单地添加一个包含以下内容的新列:

    ALTER TABLE {tableName} ADD COLUMN COLNew {type};
    

    第二,更复杂,但实际上会将列放在您想要的位置,将重命名表:

    ALTER TABLE {tableName} RENAME TO TempOldTable;
    

    然后创建缺少列的新表:

    CREATE TABLE {tableName} (name TEXT, COLNew {type} DEFAULT {defaultValue}, qty INTEGER, rate REAL);
    

    并用旧数据填充它:

    INSERT INTO {tableName} (name, qty, rate) SELECT name, qty, rate FROM TempOldTable;
    

    然后删除旧表:

    DROP TABLE TempOldTable;
    

    我更喜欢第二个选项,因为它可以让您在需要时完全重命名所有内容。

    【讨论】:

      猜你喜欢
      • 2021-12-29
      • 2016-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-10
      • 1970-01-01
      • 2015-08-22
      • 2019-09-22
      相关资源
      最近更新 更多