2015-06-16 30 views
1

版本:9.4.2 PostgreSQL的PostgreSQL的:意外插入結果

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,則結果是正確的。什麼是更離奇的是它也是正確的,如果,如果我使用INSERT方法拆分上面的腳本分成兩個獨立的腳本

  1. 創建一個從T1 T3和T1的數據複製到T3
  2. 複製T3到T2。

任何線索?

+4

關係數據庫中的行不是***排序的。所以「* id的順序似乎是隨機的*」完全可以,因爲沒有「*行的順序*」之類的東西。唯一的,(真的:只有**)獲得特定訂單或行的方法是在'select'語句中使用'order by' –

+0

http://stackoverflow.com/a/17762282/330315 –

回答

1

您沒有指定ORDER BY子句。如果沒有,PostgreSQL可能會以最快的執行順序爲您的SELECT提取行。

嘗試:

CREATE TABLE T3 (LIKE T1 INCLUDING ALL); 

INSERT INTO T3 
SELECT * FROM T1 ORDER BY T1.id; 

需要注意的是嚴格的,沒有保證多行的INSERT將處理在它們從SELECT讀的順序排,但在實踐中的PostgreSQL在這個時候總是會對其進行處理爲了也不可能匆匆改變。