在sqlite中将新列插入表中?

Tes*_*ter 334 sqlite

我有一个列的表name,qty,rate.现在我需要COLNewnameqty列之间添加一个新列.如何在两列之间添加新列?

Rac*_*ion 650

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

ALTER TABLE {tableName} ADD COLUMN COLNew {type};
Run Code Online (Sandbox Code Playgroud)

其次,更复杂,但实际上将列放在您想要的位置,将重命名表:

ALTER TABLE {tableName} RENAME TO TempOldTable;
Run Code Online (Sandbox Code Playgroud)

然后使用缺少的列创建新表:

CREATE TABLE {tableName} (name TEXT, COLNew {type} DEFAULT {defaultValue}, qty INTEGER, rate REAL);
Run Code Online (Sandbox Code Playgroud)

并使用旧数据填充它:

INSERT INTO {tableName} (name, qty, rate) SELECT name, qty, rate FROM TempOldTable;
Run Code Online (Sandbox Code Playgroud)

然后删除旧表:

DROP TABLE TempOldTable;
Run Code Online (Sandbox Code Playgroud)

我更喜欢第二种选择,因为它可以让你在需要时完全重命名.

  • 我会选择第一个选项,并使用secend选项中的默认选项ALTER TABLE {tableName} ADD COLUMN COLNew {type} DEFAULT {defaultValue}; 更重要的是:在每一个记录行动(想为什么你想订购的列..)使用(如插入或添加)总是列名,这样一来,你将永远不会改变表后得到错误somewheere在你的代码. (23认同)
  • 不要忘记重新创建索引 (8认同)
  • 不要忘记由外键引起的潜在约束违规:"......但可能会调用外键操作或违反约束." (见http://www.sqlite.org/foreignkeys.html#fk_schemacommands); 作为一种解决方法,你可以同时禁用外键:`PRAGMA foreign_keys = ON;`(参见http://www.sqlite.org/foreignkeys.html#fk_enable) (7认同)
  • 顺便说一下:对于某些字段类型,无法在ALTER TABLE中添加默认值:http://www.sqlite.org/lang_altertable.html (5认同)
  • 您还需要重新创建触发器 (5认同)

pax*_*blo 102

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

换句话说,如果您想在订单中{name,colnew,qty,rate}使用它们,则使用:

select name, colnew, qty, rate from ...
Run Code Online (Sandbox Code Playgroud)

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

alter table mytable add column colnew char(50)
Run Code Online (Sandbox Code Playgroud)

  • 很少有用例你应该做`select*`.对于想要发现表的程序来说,它有时很方便,但是对于绝大多数用途,您应该明确指定您想要的内容,从而明确指定您想要它的顺序. (11认同)
  • 这是不是"接受的答案",这是疯了.原始问题本身表明完全缺乏对RDBMS如何工作的理解. (4认同)
  • `SELECT*FROM mytable`? (2认同)

CJH*_*CJH 11

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;
Run Code Online (Sandbox Code Playgroud)

现在您已准备好插入新数据,如下所示:

UPDATE t1 SET b='blah' WHERE a='key'
Run Code Online (Sandbox Code Playgroud)


Mud*_*sir 10

您可以使用查询添加新列

ALTER TABLE TableName ADD COLUMN COLNew CHAR(25)
Run Code Online (Sandbox Code Playgroud)

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


Nav*_*Jha 5

ALTER TABLE {tableName} ADD COLUMN COLNew {type};
UPDATE {tableName} SET COLNew = {base on {type} pass value here};
Run Code Online (Sandbox Code Playgroud)

需要此更新来处理空值,并根据需要输入默认值。如您的情况,您需要调用SELECT查询,您将获得列的顺序,正如paxdiablo已经说过的:

SELECT name, colnew, qty, rate FROM{tablename}
Run Code Online (Sandbox Code Playgroud)

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

private static final String ColNew="ColNew";
String val=cursor.getString(cursor.getColumnIndex(ColNew));
Run Code Online (Sandbox Code Playgroud)

因此,如果索引更改,您的应用程序将不会遇到任何问题。

从某种意义上讲,这是一种安全的方法,否则,如果您使用CREATE temptableRENAME tableCREATE,那么如果不小心处理(例如在电池快要用完时进行交易的情况下),很有可能会丢失数据。