用于创建插入脚本的SQL脚本

Ben*_*ard 12 sql postgresql

有点模糊的标题,我会解释.

我正在编写一个SQL脚本来为我的数据库中的每一行创建一个insert语句,纯粹是为了能够将该数据应用回另一个数据库.

这就是我现在所拥有的:

SELECT 'INSERT INTO products (id,name,description) VALUES ('||ID||','''||name||''','''||description||''');' FROM products
Run Code Online (Sandbox Code Playgroud)

并且效果很好,输出:

INSERT INTO products (id,name,description) VALUES (1,'Lorem','Ipsum');
INSERT INTO products (id,name,description) VALUES (2,'Lorem','Ipsum');
INSERT INTO products (id,name,description) VALUES (3,'Lorem','Ipsum');
INSERT INTO products (id,name,description) VALUES (4,'Lorem','Ipsum');
Run Code Online (Sandbox Code Playgroud)

问题是如果其中一个字段为空,该行将无法生成更新脚本,则在输出文件中该行只是空白.显然,因为有20多个字段,一些可选,这意味着几乎没有任何脚本生成.

有没有办法解决这个问题?

小智 13

pg_dump -a -U user1 -t products -f products.copy database1
Run Code Online (Sandbox Code Playgroud)

然后:

psql -U user2 -d database2 -f products.copy
Run Code Online (Sandbox Code Playgroud)

你完成了 它也更安全,更快捷.


int*_*tgr 5

使用quote_nullable()PostgreSQL 8.4 中的 new 函数。除了允许 NULL 值外,它还保留您的数据类型并保护您免受 Bobby 表(SQL 注入)的影响:

SELECT 'INSERT INTO products (id,name,description) VALUES (' ||
quote_nullable(ID) || ',' || quote_nullable(name) || ',' ||
quote_nullable(description) || ');' FROM products;
Run Code Online (Sandbox Code Playgroud)

在旧版本中,您可以使用coalesce()and获得相同的行为quote_literal()

SELECT 'INSERT INTO products (id,name,description) VALUES (' ||
coalesce(quote_literal(ID), 'null') || ',' ||
coalesce(quote_literal(name), 'null') || ',' ||
coalesce(quote_literal(description), 'null') || ',' ||
');' FROM products;
Run Code Online (Sandbox Code Playgroud)


Chr*_*ark 5

在NULL字段的情况下,您可以执行类似的操作

Select COALESCE(Name, '') from...
Run Code Online (Sandbox Code Playgroud)

coalesce函数返回列表中的第一个非空值.

对于真正空白的字段(例如空的nvarchar),我相信上面的脚本可以正常工作.

  • 只需使用`... || COALESCE(列,'NULL')|| ......相反. (3认同)
  • 这也不会生成完全相同的行.如上所述的合并将最终插入空字符串值,它应插入NULL值. (2认同)