我在Sqlite3 db中有很多表,现在我想将它导出到PostgreSQL,但是我一直都会遇到错误。 我使用了不同的技术从sqlite转储:
.mode csv
.header on
.out ddd.sql
从my_table中选择*
和
.mode insert
.out ddd.sql
从my_table中选择*
当我尝试通过phppgadmin导入它时,我得到这样的错误:
错误:关系“my_table”的列“1”不存在
第1行:INSERT INTO“public”。“my_table”(“1”,“1”,“Vitas”,“a @ i.ua”,“..
如何避免此错误?
提前致谢!
答案 0 :(得分:4)
你得到这个“列...不存在”错误INSERT INTO "public"."my_table" ("1", ...
- 因为“1”周围的引号表示这是identifier,而不是{{ 3}}
即使您修复此问题,查询仍会出错,因为缺少VAULES
关键字,正如Jan在其他答案中注意到的那样。
正确的形式是:
INSERT INTO "public"."my_table" VALUES ('1', ...
如果这个SQL是由sqlite自动生成的,那么sqlite就不好了。
这个伟大的literal只有大约20页的印刷版。我对生成此INSERT的人的建议是:读取它 :-)它会得到回报。
现在,重点...要将表从sqlite转移到postgres,你应该使用COPY,因为它比INSERT快。
使用双面理解的CSV格式。
在sqlite3中:
create table tbl1(one varchar(20), two smallint);
insert into tbl1 values('hello',10);
insert into tbl1 values('with,comma', 20);
insert into tbl1 values('with "quotes"', 30);
insert into tbl1 values('with
enter', 40);
.mode csv
.header on
.out tbl1.csv
select * from tbl1;
在PostgreSQL(psql客户端)中:
create table tbl1(one varchar(20), two smallint);
\copy tbl1 from 'tbl1.csv' with csv header delimiter ','
select * from tbl1;
答案 1 :(得分:2)
似乎缺少“VALUES”关键字:
INSERT INTO "public"."my_table" VALUES (...)
但是! - 您必须插入带有适当引号的值 - 文本的单引号和数字的引号。