在sqlite中将新列插入表中?

时间:2010-11-23 07:45:37

标签: sqlite

我有一个包含nameqtyrate列的表格。现在,我需要在COLNewname列之间添加新列qty。如何在两列之间添加新列?

6 个答案:

答案 0 :(得分:633)

您有两种选择。 首先,您只需添加一个包含以下内容的新列:

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;

我更喜欢第二个选项,因为如果需要,它可以让你完全重命名。

答案 1 :(得分:94)

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

换句话说,如果您想按照{name,colnew,qty,rate}的顺序使用它们,请使用:

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

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

alter table mytable add column colnew char(50)

答案 2 :(得分:9)

您可以使用查询

添加新列
ALTER TABLE TableName ADD COLUMN COLNew CHAR(25)

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

答案 3 :(得分:9)

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'

答案 4 :(得分:4)

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,如果处理不当,则数据丢失的可能性很高,例如,在电池电量耗尽时发生交易的情况。

答案 5 :(得分:1)

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

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

在* nix之类的系统中只是

的内容
cat db.sql | sqlite3 database.db

我不知道这对于非常大的数据库是多么可行,但它适用于我的情况。