我有一个包含 name , qty , rate 列的表 . 现在我需要在 name 和 qty 列之间添加一个新列 COLNew . 如何在两列之间添加新列?
name
qty
rate
COLNew
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'
您不在SQL中的其他列之间添加列,只需添加它们即可 . 他们放在哪里完全取决于DBMS . 确保列按正确顺序排列的正确位置是 select .
select
换句话说,如果您希望它们按 {name,colnew,qty,rate} 的顺序使用,则使用:
{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};
其次,更复杂,但实际上将列放在您想要的位置,将重命名表:
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}; UPDATE {tableName} SET COLNew = {base on {type} pass value here};
需要此更新来处理空值,根据需要输入默认值 . 在您的情况下,您需要调用 SELECT 查询,您将获得列的顺序,如paxdiablo已经说过:
SELECT
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 ,如果处理不当,将很有可能丢失数据,例如在电池电量耗尽时发生交易的情况 .
CREATE temptable
RENAME table
CREATE
我正面临着同样的问题,正如评论中所提到的,在接受的答案中提出的第二种方法在处理外键时可能会有问题 .
我的解决方法是将数据库导出到sql文件,确保INSERT语句包含列名 . 我使用DB Browser for SQLite这样做,它有一个方便的功能 . 之后,您只需编辑create table语句并将新列插入所需位置并重新创建db .
在* nix之类的系统中只是一些东西
cat db.sql | sqlite3 database.db
我不知道这对于非常大的数据库是多么可行,但它在我的案例中起作用 .
6 回答
SQLite限制了ALTER TABLE支持,您可以使用该支持将列添加到表的末尾或更改表的名称 .
如果要在表的结构中进行更复杂的更改,则必须重新创建表 . 您可以将现有数据保存到临时表,删除旧表,创建新表,然后从临时表中复制数据 .
例如,假设您有一个名为“t1”的表,其列名为“a”和“c”,并且您希望从此表中插入列“b” . 以下步骤说明了如何完成此操作:
现在您已准备好插入新数据,如下所示:
您不在SQL中的其他列之间添加列,只需添加它们即可 . 他们放在哪里完全取决于DBMS . 确保列按正确顺序排列的正确位置是
select
.换句话说,如果您希望它们按
{name,colnew,qty,rate}
的顺序使用,则使用:使用SQLite,您需要使用alter table,例如:
您可以使用查询添加新列
但它会在最后添加,而不是在现有列之间添加 .
你有两个选择 . 首先,您只需添加一个包含以下内容的新列:
其次,更复杂,但实际上将列放在您想要的位置,将重命名表:
然后使用缺少的列创建新表:
并用旧数据填充它:
然后删除旧表:
我更喜欢第二个选项,因为如果需要,它可以让你完全重命名 .
需要此更新来处理空值,根据需要输入默认值 . 在您的情况下,您需要调用
SELECT
查询,您将获得列的顺序,如paxdiablo已经说过:在我看来,你的列名是从光标获取值:
因此,如果索引更改您的应用程序将不会遇到任何问题 .
从某种意义上讲,这是安全的方式,否则,如果您使用
CREATE temptable
或RENAME table
或CREATE
,如果处理不当,将很有可能丢失数据,例如在电池电量耗尽时发生交易的情况 .我正面临着同样的问题,正如评论中所提到的,在接受的答案中提出的第二种方法在处理外键时可能会有问题 .
我的解决方法是将数据库导出到sql文件,确保INSERT语句包含列名 . 我使用DB Browser for SQLite这样做,它有一个方便的功能 . 之后,您只需编辑create table语句并将新列插入所需位置并重新创建db .
在* nix之类的系统中只是一些东西
我不知道这对于非常大的数据库是多么可行,但它在我的案例中起作用 .