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

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

380092 次浏览

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

换句话说,如果你想让它们按照{name,colnew,qty,rate}的顺序排列,你可以使用:

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

对于SQLite,你需要使用alter table,一个例子是:

alter table mytable add column colnew char(50)

您可以使用查询添加新列

ALTER TABLE TableName ADD COLUMN COLNew CHAR(25)

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

你有两个选择。 首先,你可以简单地用下面的代码添加一个新列:

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;

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

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'
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,如果不小心处理,就会有很高的数据丢失几率,例如在电池即将耗尽的情况下,你的事务发生。

我也遇到了同样的问题,正如评论中所指出的,在接受的答案中提出的第二种方法在处理外键时可能会有问题。

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

在*nix中,like系统只是沿着

cat db.sql | sqlite3 database.db

我不知道这在非常大的数据库中是否可行,但在我的案例中是可行的。

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

ALTER TABLE {tableName} RENAME TO TempOldTable

这是我在第一次尝试向已经创建的DB表添加列时尝试的行。它失败了,但为什么可能是一个更好的问题。这里是失败的代码行。

   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都是一个字符串。以防有人尝试了公认的答案!