在sqlite的表中插入新列?

Posted

技术标签:

【中文标题】在sqlite的表中插入新列?【英文标题】:Insert new column into table in sqlite? 【发布时间】:2011-05-14 07:40:08 【问题描述】:

我有一个表格,其中包含 nameqtyrate 列。现在我需要在nameqty 列之间添加一个新列COLNew。如何在两列之间添加新列?

【问题讨论】:

【参考方案1】:

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

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;

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

【讨论】:

我会选择第一个选项,并使用第二个选项中的默认选项 ALTER TABLE tableName ADD COLUMN COLNew type DEFAULT defaultValue;更重要的是:(考虑为什么要对列进行排序..)在每个记录操作(如插入或添加)中始终使用列名,这样,在更改表后,您将永远不会在代码中的某个地方出错。 顺便说一句:对于某些字段类型,不能在 ALTER TABLE 中添加默认值:sqlite.org/lang_altertable.html 别忘了重新创建索引 您还需要重新创建触发器 不要忘记由外键引起的潜在约束违规:“...但可能会调用外键操作或约束违规。” (见sqlite.org/foreignkeys.html#fk_schemacommands);作为一种解决方法,您可以同时禁用外键:PRAGMA foreign_keys = ON;(请参阅sqlite.org/foreignkeys.html#fk_enable)【参考方案2】:

您不会在 SQL 中的其他列之间添加列,您只需添加它们。它们的放置位置完全取决于 DBMS。确保列以正确顺序出现的正确位置是您 select 他们时。

换句话说,如果您希望它们按name,colnew,qty,rate 的顺序排列,您可以使用:

select name, colnew, qty, rate from ...

使用 SQLite,您需要使用alter table,例如:

alter table mytable add column colnew char(50)

【讨论】:

SELECT * FROM mytable? 如果我们不在新列的现有行中指定默认值设置是什么? 很少有你应该使用select * 的用例。它有时对于想要发现表的程序很方便,但对于绝大多数用途,您应该明确指定您想要的内容以及您想要的顺序。 这不是“公认的答案”,这太疯狂了。最初的问题本身表明对 RDBMS 的工作原理完全缺乏了解。【参考方案3】:

您可以使用查询添加新列

ALTER TABLE TableName ADD COLUMN COLNew CHAR(25)

但它会添加到最后,而不是在现有列之间。

【讨论】:

【参考方案4】:

SQLite 具有有限的 ALTER TABLE 支持,您可以使用它来将列添加到表的末尾或更改表的名称。

如果您想对表的结构进行更复杂的更改,则必须重新创建表。您可以将现有数据保存到临时表中,删除旧表,创建新表,然后将数据从临时表中复制回来。

例如,假设您有一个名为“t1”的表,其中列名为“a”和“c”,并且您希望从该表中插入列“b”。以下步骤说明了如何做到这一点:

BEGIN TRANSACTION;
CREATE TEMPORARY TABLE t1_backup(a,c);
INSERT INTO t1_backup SELECT a,c FROM t1;
DROP TABLE t1;
CREATE TABLE t1(a,b, c);
INSERT INTO t1 SELECT a,c FROM t1_backup;
DROP TABLE t1_backup;
COMMIT;

现在您可以像这样插入新数据了:

UPDATE t1 SET b='blah' WHERE a='key'

【讨论】:

在我的测试中,INSERT INTO t1 SELECT a,c FROM t1_backup; 行导致错误:“表 t1 有 3 列,但提供了 2 个值:INSERT INTO t1 SELECT a,c FROM t1_backup;”。正确的行应该是INSERT INTO t1 (a,c) SELECT a,c FROM t1_backup;【参考方案5】:
ALTER TABLE tableName ADD COLUMN COLNew type;
UPDATE tableName SET COLNew = base on type pass value here;

需要此更新来处理空值,根据需要输入默认值。与您的情况一样,您需要调用SELECT 查询,您将获得列的顺序,正如paxdiablo 已经说过的那样:

SELECT name, colnew, qty, rate FROMtablename

在我看来,你的列名从光标中获取值:

private static final String ColNew="ColNew";
String val=cursor.getString(cursor.getColumnIndex(ColNew));

因此,如果索引发生更改,您的应用程序将不会遇到任何问题。

这是安全的方式,否则,如果您使用 CREATE temptableRENAME tableCREATE,如果不小心处理,数据丢失的可能性很大,例如在以下情况下您的交易发生在电池耗尽时。

【讨论】:

【参考方案6】:

我遇到了同样的问题,而在接受的答案中提出的第二种方法,如 cmets 中所述,在处理外键时可能会出现问题。

我的解决方法是将数据库导出到 sql 文件,确保 INSERT 语句包含列名。我使用DB Browser for SQLite 来做这件事,它有一个方便的功能。之后,您只需编辑 create table 语句并将新列插入您想要的位置并重新创建数据库。

在*nix 之类的系统中只是类似于

cat db.sql | sqlite3 database.db

我不知道这对于非常大的数据库有多可行,但它在我的情况下有效。

【讨论】:

【参考方案7】:

我很少为 11 岁的问题添加答案。也就是说,有很多选票的答案有一段误导性的代码。我说误导是因为我尝试过但没有成功。这是我引用的代码行。

ALTER TABLE tableName RENAME TO TempOldTable

这是我第一次尝试将列添加到已创建的数据库表中的行。它失败了,但为什么可能是一个更好的问题。这里的任何方式都是失败的代码行。

   Dim tb As String = "IncomeTable"
   Dim sqlCmd As String = "$ALTER TABLE" 'tb' "ADD COLUMN itNumVisit INTEGER"

所以这是在我的例子中添加一个新列的最终代码,它是一个 INTEGER 类型。

    Private Sub btnCopyTable_Click(sender As Object, e As EventArgs) Handles btnCopyTable.Click

    Dim sqlCmd As String = "ALTER TABLE IncomeTable ADD COLUMN itNumVisit INTEGER"
    Try
        Using conn As New SQLiteConnection($"Data Source = 'gv_dbName';Version=3;")
            conn.Open()

            Using cmd As New SQLiteCommand(sqlCmd, conn)

                cmd.ExecuteNonQuery()
            End Using
        End Using

    Catch ex As Exception
        MsgBox("It Failed")
    End Try
End Sub

注意 STRING sqlCmd 都是一个字符串。以防万一有人尝试接受的答案!

【讨论】:

以上是关于在sqlite的表中插入新列?的主要内容,如果未能解决你的问题,请参考以下文章

SQlite 怎么在已经创建的表中插入一列

在 SQLite 中将 SQL 数据插入到链接(外键)表中

检索在 sqlite 数据库中插入的所有行,并在包含标签的表视图单元格中显示为具有不同部分的子视图

将 SQLite 表数据显示到列表视图中,就在将数据插入同一 Activity 上的表之后,无需关闭 Activity 并重新打开

如何从 SQLite 中的表中选择最新的 100 个不同条目?

无法使用 Entity Framework 5 在 SQLite 数据库中插入记录