Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否在sqlite中的表中插入新列?_Sqlite - Fatal编程技术网

是否在sqlite中的表中插入新列?

是否在sqlite中的表中插入新列?,sqlite,Sqlite,我有一个表,列有名称,数量,费率。现在我需要在name和qty列之间添加一个新列COLNew。如何在两列之间添加新列?在SQL中,不在其他列之间添加列,只需添加它们即可。它们放在哪里完全取决于DBMS。确保列按正确顺序显示的正确位置是在选择列时 换句话说,如果您希望它们按顺序排列{name,colnew,qty,rate},您可以使用: select name, colnew, qty, rate from ... 对于SQLite,您需要使用,例如: alter table mytable

我有一个表,列有
名称
数量
费率
。现在我需要在
name
qty
列之间添加一个新列
COLNew
。如何在两列之间添加新列?

在SQL中,不在其他列之间添加列,只需添加它们即可。它们放在哪里完全取决于DBMS。确保列按正确顺序显示的正确位置是在
选择列时

换句话说,如果您希望它们按顺序排列
{name,colnew,qty,rate},您可以使用:

select name, colnew, qty, rate from ...
对于SQLite,您需要使用,例如:

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;

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

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'
需要此更新来处理空值,并根据需要输入默认值。与您的情况一样,您需要调用
SELECT
查询,您将获得列的顺序,如前所述:

SELECT name, colnew, qty, rate FROM{tablename}
在我看来,要从光标中获取值,您需要使用列名:

private static final String ColNew="ColNew";
String val=cursor.getString(cursor.getColumnIndex(ColNew));
因此,如果索引更改,您的应用程序将不会面临任何问题


从某种意义上讲,这是一种安全的方法,否则,如果您使用
CREATE tentable
RENAME table
CREATE
,如果不小心处理,例如在电池耗尽时发生事务的情况下,数据丢失的可能性很高

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

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

在*nix类系统中,它只是沿着

cat db.sql | sqlite3 database.db

我不知道这对于非常大的数据库来说有多可行,但在我的情况下它是有效的。

我会选择第一个选项,并使用第二个选项ALTER TABLE{tableName}ADD COLUMN COLNew{type}default{defaultValue}中的default选项;更重要的是:(考虑为什么要对列进行排序…)在每个记录操作(如插入或添加)中始终使用列名,这样,更改表后,您的代码中永远不会出现错误。顺便说一下:对于某些字段类型,无法在ALTER table中添加默认值:不要忘记重新创建索引您还需要重新创建触发器,不要忘记外键可能导致的约束冲突:"... 但可能会调用外键操作或违反约束。”(请参阅);作为一种解决方法,您可以同时禁用外键:
PRAGMA foreign\u keys=ON;
(请参阅)
SELECT*FROM mytable
?如果我们不在新列的现有行中指定默认值集,那么默认值集是什么?您应该执行
SELECT*
的用例很少。对于希望查找表的程序来说,它有时很方便,但对于绝大多数使用,您应该明确指定什么你想要,因此你想要它的顺序。这不是“公认的答案”真是不可思议。原始问题本身表明完全不了解RDBMS是如何工作的。在我的测试中,第
行插入t1从t1_备份中选择a,c;
导致错误:表t1有3列,但提供了2个值:插入到t1中,从t1\U备份中选择a、c;“。正确的行应该是
插入t1(a,c)从t1\U备份中选择a,c;
cat db.sql | sqlite3 database.db