Postgresql:意外的插入结果

时间:2015-06-16 18:50:18

标签: postgresql

版本:PostgreSQL 9.4.2

   Column   |  Type   |                           Modifiers                            
------------+---------+----------------------------------------------------------------
 id         | integer | not null default nextval('T1_id_seq'::regclass)
 name       | text    | 
 value      | text    | 
 parent_id  | integer | 

Indexes:
    "T1_pkey" PRIMARY KEY, btree (id)
    "T1_id_idx" btree (id)

我在Postgresql中有两个这样的表,比如T1和T2,树状数据结构引用自己表中的数据。

我需要修改T1中的某些行,然后按照T1中出现的行的顺序将其插入T2。到目前为止我所做的是将表T1中的相关行复制到临时表T3以进行数据修改,并在更改时插入从T3到T2的所有内容。制成。

使用

创建T3
CREATE TABLE T3 (LIKE T1 INCLUDING ALL)
INSERT * INTO T3 SELECT * FROM T1

最终结果相当奇怪。来自T3的所有数据都被复制到T2,但是ID的顺序似乎是随机的。

但是,如果我调用相同的脚本直接将数据从T1复制到T3,结果是正确的。更奇怪的是,如果我将上述脚本分成两个单独的脚本,它也是正确的

  1. 从T1创建T3并将数据从T1复制到T3
  2. 使用INSERT方法将T3复制到T2。
  3. 任何线索?

1 个答案:

答案 0 :(得分:1)

您没有指定currentPlayer = session.query(Player).filter(Player.firstName == playerObject.firstName).filter(playerObject.lastName == Player.lastName).first()子句。如果没有一个,PostgreSQL可能会以最快的顺序获取ORDER BY的行。

尝试:

SELECT

请注意,严格来说,不能保证多行的CREATE TABLE T3 (LIKE T1 INCLUDING ALL); INSERT INTO T3 SELECT * FROM T1 ORDER BY T1.id; 将按照从INSERT读取的顺序处理行,但实际上PostgreSQL此时将始终按顺序处理它们而且它不太可能匆忙改变。