如何通过postgresql上的新记录更改旧记录?
这是我的记录。如何通过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可以为空。
你可以这样做,如果你只有四项:
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;
我会检查和更新的答案。
你是几乎没有,当你写道:
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)
;
好吧,你想根据用户名匹配它们。但是,您如何知道哪一行需要更新以及哪一行应该是此更新的来源?它是'show'字段吗?这是'ID'的区别吗?它是'note_mod'是NULL吗? – joop