Sqlite:为查询结果创建新表并保留原始模式

时间:2016-03-03 13:36:32

标签: c database sqlite database-schema

我有以下db文件(DB1.db)只包含一个表:

sqlite> .dump
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE CARS (ID INT KEY NOT NULL, COMPANY CHAR(20) NOT NULL, COLOR CHAR(10) NOT NULL);
INSERT INTO "CARS" VALUES(111,'Hyundai','White');
INSERT INTO "CARS" VALUES(222,'BMW','Black');
INSERT INTO "CARS" VALUES(333,'Toyota','Blue');
COMMIT;

为了在两个不同数据库中的两个表之间进行连接,我将DB1.db(和另一个db)连接到DB2.db中:

sqlite> ATTACH DATABASE 'DB1.db' AS 'db1' ;

'CARS'表格信息如下:

sqlite> PRAGMA TABLE_INFO(CARS);
0|ID|INT KEY|1||0
1|COMPANY|CHAR(20)|1||0
2|COLOR|CHAR(10)|1||0

接下来,最后,我想对附加的表运行查询并将结果保存在DB2.db中的新表中:

sqlite> CREATE TABLE RES1 AS SELECT ID,COMPANY FROM CARS WHERE ID='333';

正如我所料,结果出现在一个新表中:

sqlite> SELECT * FROM RES1 ;
333|Toyota

但新表格信息如下:

sqlite> PRAGMA TABLE_INFO(RES1);
0|ID|INT|0||0
1|COMPANY|TEXT|0||0

正如您所看到的,我丢失了'COMPANY'列类型 - 它不再是'CHAR(20)'并且列可能为空('NOT NULL'为0而不是之前的1)。

我的问题: 如何执行上述操作(将结果附加到新表中并查询结果)仍然不会丢失原始表信息?

1 个答案:

答案 0 :(得分:1)

这与ATTACHing无关。

CREATE TABLE ... AS ...不保留表定义;它创建了一个表,其中包含最少的类型信息,以便能够存储值。

如果要使用任何不同的表定义,则必须手动创建表,然后使用INSERT INTO … SELECT …插入数据。