如何通过postgresql上的新记录更改旧记录?

时间:2016-11-17 09:42:21

标签: 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     |       | 

我想改变音符,测试note_mod,test_mod 2和4中的1和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' bla bla bla ...

我正在寻找这样的代码。

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

old是卑鄙的id 1' note_mod。 new是卑鄙的id 2' note_mod。 但我不知道如何在UPDATE上定义新旧。有什么想法吗?

我想从user_id匹配它们。 status = 1表示用户注册帐户(example.com/create) 然后user_id,note_mod,test_mod始终为null。 名称是必需的。注意,测试可以为空。

status = 2表示编辑个人资料(example.com/1/edit) 然后user_id自动设置ID($ data - > user_id = $ request - > id)

如果用户更改个人资料,个人资料不会立即更改。 配置文件只能通过我的sql代码更改。

如果用户更改笔记或测试, 设置为note_mod或test_mod,而不是注释或测试。 ($ data - > note_mod = $ request - > note) note,test,note_mod,test_mod可以为空。

2 个答案:

答案 0 :(得分: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;

我会检查并更新答案。

答案 1 :(得分:0)

当你写下来时,你几乎就在那里:

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

(将{old,new}替换为{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)
  ;