sqlite 如何在两列之间添加新列?

yrdbyhpb  于 2022-11-15  发布在  SQLite
关注(0)|答案(7)|浏览(204)

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

ej83mcc0

ej83mcc01#

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

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

第二个,也是更复杂的,但实际上会将列放在您想要的位置,那就是使用缺失的列和一个临时新名称创建新表:

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

并用旧数据填充它:

INSERT INTO {tempNewTableName} (name, qty, rate) SELECT name, qty, rate FROM OldTable;

然后删除旧表:

DROP TABLE OldTable;

然后将新表重命名为OldTable的名称:

ALTER TABLE {tempNewTableName} RENAME TO OldTable;

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

gwo2fgha

gwo2fgha2#

您不需要在SQL中的其他列之间添加列,只需添加它们即可。它们放在哪里完全取决于数据库管理系统。确保列以正确顺序出现的正确位置是当您select它们时。
换句话说,如果您希望它们按{name,colnew,qty,rate}的顺序排列,则可以使用:

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

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

alter table mytable add column colnew char(50)
3z6pesqy

3z6pesqy3#

您可以使用查询添加新列

ALTER TABLE TableName ADD COLUMN COLNew CHAR(25)

但它将被添加到末尾,而不是在现有的列之间。

odopli94

odopli944#

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'
w8biq8rn

w8biq8rn5#

ALTER TABLE {tableName} ADD COLUMN COLNew {type};
UPDATE {tableName} SET COLNew = {base on {type} pass value here};

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

SELECT name, colnew, qty, rate FROM{tablename}

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

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

因此,如果索引更改,您的应用程序将不会面临任何问题。
这是一种安全的方式,否则,如果您使用CREATE temptableRENAME tableCREATE,如果不小心处理,例如在电池耗尽时发生交易的情况下,数据丢失的可能性很高。

cngwdvgl

cngwdvgl6#

我也面临着同样的问题,正如评论中提到的,公认答案中提出的第二种方法在处理外键时可能会出现问题。
我的解决方法是将数据库导出到一个SQL文件中,确保INSERT语句包括列名。我使用的是DB Browser for SQLite,它有一个很方便的特性。之后,您只需编辑CREATE TABLE语句,在需要的位置插入新列,然后重新创建数据库。
在*NIX类系统中,只是大致的

cat db.sql | sqlite3 database.db

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

kjthegm6

kjthegm67#

我很少回答11岁的老问题。这就是说,有很多选票的答案有一行误导性的代码。我说误导是因为我试过了,但没有成功。以下是我引用的代码行。

ALTER TABLE {tableName} RENAME TO TempOldTable

这是我在第一次尝试将列添加到已经创建的DB表中时尝试的行。它失败了,但为什么会是一个更好的问题。无论如何,这里都是失败的代码行。

Dim tb As String = "IncomeTable"
   Dim sqlCmd As String = "$ALTER TABLE" '{tb}' "ADD COLUMN itNumVisit 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

请注意,字符串sqlCmd都是一个字符串。以防万一有人尝试了公认的答案!

相关问题