我有一个表的列名称,数量,率。我需要在名称和qty列之间添加一个新列COLNew。如何在两列之间添加新列?
在SQL中,您不需要在其他列之间添加列,而只是添加它们。它们放在哪里完全取决于DBMS。确保列以正确顺序出现的正确位置是在选择它们时。
换句话说,如果你想让它们按照{name,colnew,qty,rate}的顺序排列,你可以使用:
select name, colnew, qty, rate from ...
使用SQLite,你需要使用alter表,一个例子是:
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 temptable或RENAME table或CREATE,如果不仔细处理,就会有很高的数据丢失几率,例如在电池即将耗尽时发生事务的情况下。
我也遇到了同样的问题,正如评论中所指出的,在接受的答案中提出的第二种方法在处理外键时可能会有问题。
我的解决方法是将数据库导出到一个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"
下面是最后的代码,它添加了一个新的Column,在我的例子中是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数据库文件使用什么扩展名重要吗?
- 无法加载DLL 'SQLite.Interop.dll'
- 快速简单的方法迁移SQLite3到MySQL?
- 在Ubuntu上安装sqlite3-ruby错误
- sqlite3。ProgrammingError:提供的绑定数量不正确。当前语句使用1,并提供了74个
- SQLite有。net / c#包装器吗?
- Android开发有什么好的ORM工具吗?
- 如何在SQLite中看到表的结构?
- Android中使用的SQLite版本?
- Core Data vs SQLite 3
- 如何在SQLITE中删除或添加列?
- 如何解锁SQLite数据库?
- 什么时候SQLiteOpenHelper onCreate() / onUpgrade()运行?
- 如何重命名SQLite数据库表中的列?
- 仅当表不存在时才在SQLite中创建表