如何使用外键将文件转换为INSERT?

时间:2015-12-30 02:29:55

标签: mysql database postgresql

来自我的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的多重关系。 objectsgroup_colors

之间存在one_to_one关系

我想生成自己的脚本,只有一个脚本

  • 创建表格colorsgroup_colorsobjects
  • INSERT
  • 创建colors语句
  • 基于之前的INSERT语句,使用ID colorsINSERT
  • 创建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行))和不止一次

你会怎么做?

1 个答案:

答案 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),请确保您不使用旧版本。