Sqlite:为查询结果创建新的 table 并保留原始架构
Sqlite: Create new table for query results and keep the original schema
我有以下数据库文件 (DB1.db) 只包含一个 table:
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;
为了连接两个不同数据库中的两个 table,我将 DB1.db(和另一个数据库)附加到 DB2.db:
sqlite> ATTACH DATABASE 'DB1.db' AS 'db1' ;
'CARS' table 信息如下所示:
sqlite> PRAGMA TABLE_INFO(CARS);
0|ID|INT KEY|1||0
1|COMPANY|CHAR(20)|1||0
2|COLOR|CHAR(10)|1||0
接下来也是最后,我想 运行 查询附加的 table 并将结果保存在新的 table in DB2.db:
sqlite> CREATE TABLE RES1 AS SELECT ID,COMPANY FROM CARS WHERE ID='333';
如我所料,结果是新的 table:
sqlite> SELECT * FROM RES1 ;
333|Toyota
但是新的 table 信息看起来像:
sqlite> PRAGMA TABLE_INFO(RES1);
0|ID|INT|0||0
1|COMPANY|TEXT|0||0
如您所见,我丢失了 'COMPANY' 列类型 - 它不再是 'CHAR(20)' 并且该列可能为空('NOT NULL' 是 0 而不是之前的 1 ).
我的问题:
我怎样才能做到上面的操作(附加和查询结果到新的table)而不丢失原来的table信息?
这与ATTACHing无关。
CREATE TABLE ... AS ... 不保留 table 定义;它创建了一个 table,其中包含最少的类型信息,以便能够存储值。
如果您想要任何不同的 table 定义,您必须手动创建 table,然后使用 INSERT INTO … SELECT ….
插入数据
我有以下数据库文件 (DB1.db) 只包含一个 table:
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;
为了连接两个不同数据库中的两个 table,我将 DB1.db(和另一个数据库)附加到 DB2.db:
sqlite> ATTACH DATABASE 'DB1.db' AS 'db1' ;
'CARS' table 信息如下所示:
sqlite> PRAGMA TABLE_INFO(CARS);
0|ID|INT KEY|1||0
1|COMPANY|CHAR(20)|1||0
2|COLOR|CHAR(10)|1||0
接下来也是最后,我想 运行 查询附加的 table 并将结果保存在新的 table in DB2.db:
sqlite> CREATE TABLE RES1 AS SELECT ID,COMPANY FROM CARS WHERE ID='333';
如我所料,结果是新的 table:
sqlite> SELECT * FROM RES1 ;
333|Toyota
但是新的 table 信息看起来像:
sqlite> PRAGMA TABLE_INFO(RES1);
0|ID|INT|0||0
1|COMPANY|TEXT|0||0
如您所见,我丢失了 'COMPANY' 列类型 - 它不再是 'CHAR(20)' 并且该列可能为空('NOT NULL' 是 0 而不是之前的 1 ).
我的问题: 我怎样才能做到上面的操作(附加和查询结果到新的table)而不丢失原来的table信息?
这与ATTACHing无关。
CREATE TABLE ... AS ... 不保留 table 定义;它创建了一个 table,其中包含最少的类型信息,以便能够存储值。
如果您想要任何不同的 table 定义,您必须手动创建 table,然后使用 INSERT INTO … SELECT ….
插入数据