sql – 行使ORDER BY更新
必要行使ORDER BY“绑定”UPDATE.我正在实行行使游标,但获得错误:
码: BEGIN; DECLARE cursUpd CURSOR FOR SELECT * FROM "table" WHERE "field" = 5760 AND "sequence" >= 0 AND "sequence" < 9 ORDER BY "sequence" DESC; UPDATE "table" SET "sequence" = "sequence" + 2 WHERE CURRENT OF cursUpd; CLOSE cursUpd; COMMIT; 怎么做得对? 更新1 没有光标,当我这样做时: UPDATE "CableLinePoint" AS "t" SET "sequence" = t."sequence" + 2 from ( select max("sequence") "sequence","id" from "CableLinePoint" where "CableLine" = 5760 group by "id" ORDER BY "sequence" DESC ) "s" where "t"."id" = "s"."id" and "t"."sequence" = "s"."sequence" 我获得了独一的错误.因此,必要从最终而不是从新开始更新. 更新2 表: id|CableLine|sequence 10| 2 | 1 11| 2 | 2 12| 2 | 3 13| 2 | 4 14| 2 | 5 必要更新(增进)字段“序列”. “序列”有“索引”范例,以是不能这样做: UPDATE "table" SET "sequence" = "sequence" + 1 WHERE "CableLine" = 2 当id = 10的行中的“序列”增进1时,我收到一个错误,即“sequence”= 2的另一行已经存在. 办理要领行使ORDER BY更新至于问题提出的题目:SQL UPDATE呼吁中没有ORDER BY. Postgres以恣意次序更新行.可是您有(有限的)选项来抉择是在每行之后,每个语句之后照旧在事宜竣事时搜查束缚.您可以行使DEFERRABLE束缚停止中间状态的一再键斗嘴. 我引用了我们在这个题目下拟定的内容: >在每行之后搜查NOT DEFERRED束缚. 可是有必然的范围性.外键束缚要求对方针列具有不行耽误的束缚.
办理要领 题目更新后更新. UPDATE tbl SET "sequence" = ("sequence" + 1) * -1 WHERE "CableLine" = 2; UPDATE tbl SET "sequence" = "sequence" * -1 WHERE "CableLine" = 2 AND "sequence" < 0; 行使不行耽误的束缚(默认),您必需运行两个单独的事宜才气使其事变.快速持续运行呼吁以停止并发题目.该办理方案显然不得当重载并发负载. 在旁边: 我提议不要行使SQL要害字作为标识符,纵然这是应承的. 停止这个题目 在更大局限或具有大量并发负载的数据库中,行使 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |