我有以下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)。
我的问题: 如何执行上述操作(将结果附加到新表中并查询结果)仍然不会丢失原始表信息?
答案 0 :(得分:1)
这与ATTACHing无关。
CREATE TABLE ... AS ...不保留表定义;它创建了一个表,其中包含最少的类型信息,以便能够存储值。
如果要使用任何不同的表定义,则必须手动创建表,然后使用INSERT INTO … SELECT …插入数据。