![](/img/trans.png)
[英]How can I log changes like “ALTER table […] ADD column” to my PostgreSQL table?
[英]PostgreSQL: how can I Alter table by setting a column of the selected rows to be increasing integers?
我有這個名為issue
的表,有數千行:
ID | 地位 | 列表位置 |
---|---|---|
43 | 新的 | 0 |
44 | 新的 | 0 |
45 | 新的 | 0 |
46 | 公認 | 0 |
51 | 公認 | 1 |
54 | 公認 | 0 |
66 | 加工 | 0 |
68 | 加工 | 0 |
我想 select 所有status
為特定值的行,如New
,並更新listPosition
值,使它們處於遞增索引中,如 1、2、3、...。
結果應該是這樣的:
ID | 地位 | 列表位置 |
---|---|---|
43 | 新的 | 1 |
44 | 新的 | 2 |
45 | 新的 | 3 |
46 | 公認 | 1 |
51 | 公認 | 2 |
54 | 公認 | 3 |
66 | 加工 | 1 |
68 | 加工 | 2 |
我怎么能在 PostgreSql 中做到這一點?
我試過了:
UPDATE issue SET listPosition= 'dummy.listPosition'
FROM
(
SELECT id, row_number() over (partition by status order by id) AS "listPosition" FROM issue
) AS dummy
WHERE issue.id= 'dummy.id';
它給出了這個錯誤:
ERROR: invalid input syntax for type integer: "dummy.id"
LINE 6: WHERE issue.id= 'dummy.id';
它是如何失敗的?
我都試過了:(不用擔心dstOrgId
的事情)
UPDATE issue SET listPosition= "dummy.listPosition"
FROM
(
SELECT id, row_number() over (partition by "dstOrgId", status order by id) AS "listPosition" FROM issue order by id
) AS dummy
WHERE issue.id = dummy.id;
WITH dummy AS
(
SELECT id, row_number() over (partition by "dstOrgId", status order by id) AS "listPosition" FROM issue order by id
)
UPDATE issue set listPosition = "dummy.listPosition"
FROM dummy
WHERE issue.id = dummy.id;
他們都給出了錯誤:
ERROR: column "dummy.listPosition" does not exist
LINE 5: UPDATE issue set listPosition = "dummy.listPosition"
為什么它在地球上不存在??? PostgreSQL 語法太奇怪了,因為它要求我將set listPosition = dummy.listPosition
更改為set listPosition = "dummy.listPosition"
,並抱怨該列不存在。
什么????
我終於通過反復試驗得到了工作命令:
UPDATE issue SET "listPosition"= dummy."listPosition"
FROM
(
SELECT id, row_number() over (partition by "dstOrgId", status order by id) AS "listPosition" FROM issue order by id
) AS dummy
WHERE issue.id = dummy.id;
無論如何,雙引號的意義以及PostgreSQL中的單引號和雙引號之間的區別是什么?
您可以通過使用row_number來實現。
select id
,status
,row_number() over (partition by status order by id) as listPosition
from t
order by id, status
ID | 地位 | 列表位置 |
---|---|---|
43 | 新的 | 1 |
44 | 新的 | 2 |
45 | 新的 | 3 |
46 | 公認 | 1 |
51 | 公認 | 2 |
54 | 公認 | 3 |
66 | 加工 | 1 |
68 | 加工 | 2 |
我終於通過反復試驗得到了工作命令:
UPDATE issue SET "listPosition"= dummy."listPosition"
FROM
(
SELECT id, row_number() over (partition by "dstOrgId", status order by id) AS "listPosition" FROM issue order by id
) AS dummy
WHERE issue.id = dummy.id;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.