来自我的question here,答案是有效的,但我试图将MySQL转换为PostgreSQL。这不是做我需要的最好方法。
我有一个包含超过60万个对象的文件:
paper
pen
whatever
...
所有这些对象都列在"循环"颜色和我知道循环是什么样的,但它不在文件本身中,所以,给你一个例子(它比例子长得多,但我希望你能得到这个想法):
- black + red
- black + blue
- black + yellow
- white + red
- white + blue
- white + yellow
- black + red
- black + blue
- ....
我已将这些颜色分成了一个明智地命名为" colors
"的表格,并且我创建了另一个名为" group_colors
的表格" #34;,这是与colors
的多重关系。 objects
与group_colors
我想生成自己的脚本,只有一个脚本:
colors
,group_colors
和objects
INSERT
colors
语句
INSERT
语句,使用ID
colors
为INSERT
group_colors
语句
INSERT
objects
语句
ID
的{{1}}和group_colors
的{{1}},为ID
创建object
个语句INSERT
这个脚本应该像这样开始:
objects_group_colors
等等。问题不在于创建表格,它是如何插入值并稍后重新使用这些值的DROP TABLE IF EXISTS color;
CREATE TABLE color (
id AUTOINC,
description VARCHAR(50)
)
DROP TABLE IF EXISTS group_colors;
CREATE TABLE group_colors(
id AUTOINC,
description VARCHAR(50)
)
DROP TABLE IF EXISTS group_colors_color;
CREATE TABLE group_colors_color(
group_colors_id INT,
color_id INT,
group_colors_id INT,
CONSTRAINT color_id NOT NULL FOREIGN KEY REFERENCES color(id),
CONSTRAINT group_colors_id NOT NULL FOREIGN KEY REFERENCES group_colors(id)
)
DROP TABLE IF EXISTS obj;
CREATE TABLE obj(
id AUTOINC,
description VARCHAR(50),
group_colors_id INT,
CONSTRAINT group_colors_id NOT NULL FOREIGN KEY REFERENCES group_colors(id)
)
(非常非常晚(> 600 000行))和不止一次。
你会怎么做?
答案 0 :(得分:1)
您似乎希望将所有数据作为大型静态文件提供给psql
命令行解释器。
因此,您可能希望使用\gset
命令返回先前插入的值并将它们加载到psql变量中(请参阅psql联机帮助页),然后可以将其重新注入脚本中的其他语句。 / p>
示例:
create table ref (id serial primary key, name text);
create table points_to_ref(fk int references ref(id));
insert into ref(name) values('foobar');
-- more queries here...
-- now get back at what we inserted first
select id as id_xyz from ref where name='foobar';
\gset
insert into points_to_ref values (:id_xyz);
\gset
的要点是从最后一个SQL语句返回的每一列创建一个psql变量。然后,您可以使用:varname
语法重新注入它们。确保它们被正确引用,如文档中所述。在上面的示例中,:id_xyz
包含一个简单的整数,因此不需要引用。
服务器永远不会看到这些变量。这是客户端发生的文本替代。这与你所链接的问题中的接受答案完全不同: PostgreSQL: a valid variable assignation sample? 在我看来,它更接近你的MySQL脚本。
同样\gset
在psql中相对较新(我认为是9.3),请确保您不使用旧版本。