2016-11-17 147 views
0

這是我的記錄。如何通過postgresql上的新記錄更改舊記錄?

SELECT * FROM items; 

id | show | status | user_id | name | note | note_mod | test | test_mod 
----+------+--------+---------+------+--------+----------+-------+---------- 
    1 | t |  1 |   | Adam | aaa1 |   | test1 | 
    2 | f |  2 |  1 | Adam | aaa1 | aaa2  | test1 | test_new1 
    3 | t |  1 |   | Tom | blabla |   |  | 
    4 | f |  2 |  3 | Tom | blabla | baaa  |  | ayyyyyy 
    5 | t |  1 |   | Eva |  |   |  | 
    6 | f |  2 |  5 | Eva |  | meow  |  | 

我想改變音符,測試1和從note_mod,test_mod 2和4這樣3個值。

id | show | status | user_id | name | note | note_mod | test | test_mod 
----+------+--------+---------+------+--------+----------+-------+---------- 
    1 | t |  1 |   | Adam | aaa1 | aaa2  | test1 | test_new1 
    2 | f |  2 |  1 | Adam | aaa1 | aaa2  | test1 | test_new1 
    3 | t |  1 |   | Tom | blabla | baaa  |  | ayyyyyy 
    4 | f |  2 |  3 | Tom | blabla | baaa  |  | ayyyyyy 
    5 | t |  1 |   | Eva |  | meow  |  | 
    6 | f |  2 |  5 | Eva |  | meow  |  | 

id 2 user_id和id 1相同,id 4 user_id和id 3相同。

我知道只有這樣的代碼才能選擇新記錄。

SELECT new.* FROM items old, items new WHERE old.id = new.user_id AND old.id != new.id; 

id | show | status | user_id | name | note | note_mod | test | test_mod 
----+------+--------+---------+------+--------+----------+-------+---------- 
    2 | f |  2 |  1 | Adam | aaa1 | aaa2  | test1 | test_new1 
    4 | f |  2 |  3 | Tom | blabla | baaa  |  | ayyyyyy 
    6 | f |  2 |  5 | Eva |  | meow  |  | 

但我不知道寫UPDATE方法。有誰知道?

P.S.

感謝您的回覆GROX13

我需要做的是從另一個記錄變化值。

如果我運行這段代碼

UPDATE items 
SET (note_mod, test_mod) = ('new1', 'test_new1') WHERE id = 1; 

記錄將改變這樣的,你知道。

id | show | status | user_id | name | note | note_mod | test | test_mod 
----+------+--------+---------+------+--------+----------+-------+---------- 
    1 | t |  1 |   | Adam | aaa1 | new1  | test1 | test_new1 

但是,代碼需要更改每個字符串「名new1」,「NEW2」,「NEW3」唧唧歪歪...

我正在尋找這樣的代碼。

UPDATE items 
SET old(note_mod, test_mod) = new(note_mod, test_mod) WHERE id = 1; 

old is mean id 1's note_mod。新是平均ID 2的note_mod。 但我不知道如何在UPDATE上定義舊的和新的。有任何想法嗎?

我想從user_id匹配它們。 status = 1意味着用戶註冊帳戶(example.com/create) then user_id,note_mod,test_mod始終爲空。 名稱是必需的。注意,測試是可空的。

狀態= 2意味着編輯個人資料(example.com/1/edit) 然後USER_ID設置ID自動($數據 - > USER_ID = $請求 - > ID)

如果用戶的變化曲線,輪廓不變化立即。 配置文件只能由我的sql代碼更改。

如果用戶更改註釋或測試, 設置爲note_mod或test_mod,而不是註釋或測試。 ($ data - > note_mod = $ request - > note) note,test,note_mod,test_mod可以爲空。

+0

好吧,你想根據用戶名匹配它們。但是,您如何知道哪一行需要更新以及哪一行應該是此更新的來源?它是'show'字段嗎?這是'ID'的區別嗎?它是'note_mod'是NULL嗎? – joop

回答

1

你可以這樣做,如果你只有四項:

UPDATE items 
SET (note_mod, test_mod) = ('new1', 'test_new1') WHERE id = 1; 

UPDATE items 
SET (note_mod, test_mod) = ('new2', 'test_new2') WHERE id = 3; 

對於你的情況,我認爲這應該工作,但還沒有測試:

UPDATE items SET (note_mod) = (note) WHERE note_mod IS NULL AND note IS NOT NULL; 

UPDATE items SET (test_mod) = (test) WHERE test_mod IS NULL AND test IS NOT NULL; 

我會檢查和更新的答案。

+0

非常快速的答覆感謝。您的代碼似乎將字符串添加到列中。但是每個價值都與'new1'不一樣。我想知道設置(1.note_mod)=(2.note_mod)...有可能嗎? – qwe001

+1

你能否在你的問題中解釋一下。我不明白什麼時候應該設置? – GROX13

+0

我想你只需要詳細說明你需要什麼。 GROX13的上述代碼將在你的問題中做你需要的。 –

0

你是幾乎沒有,當你寫道:

SELECT new.* FROM items old, items new WHERE old.id = new.user_id AND old.id != new.id; 

(更換{舊的,新}由{O,N},因爲他們是關鍵字)

UPDATE items o 
SET note_mod = n note_mod 
    , test_mod = n.test_mod 
FROM items n 
WHERE o.id = n.user_id 
AND o.id <> n.id 
-- avoid null updates: 
-- AND (o.note_mod <> n.note_mod OR o.test_mod <> n.test_mod) 
    ;