2016-11-17 94 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) 
    ;