加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

sql – 使用ORDER BY更新

发布时间:2021-03-07 16:50:54 所属栏目:编程 来源:网络整理
导读:必要行使ORDER BY“绑定”UPDATE.我正在实行行使游标,但获得错误: 06000 码: BEGIN; DECLARE cursUpd CURSOR FOR SELECT * FROM "table" WHERE "field" = 5760 AND "sequence" = 0 AND "sequence" 9 ORDER BY "sequence" DESC; UPDATE "table" SET "sequenc

必要行使ORDER BY“绑定”UPDATE.我正在实行行使游标,但获得错误:

06000

码:

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束缚停止中间状态的一再键斗嘴.

我引用了我们在这个题目下拟定的内容:
Constraint defined DEFERRABLE INITIALLY IMMEDIATE is still DEFERRED?

>在每行之后搜查NOT DEFERRED束缚.
>在每个语句后搜查配置为IMMEDIATE(INITIALLY IMMEDIATE或通过SET CONSTRAINTS)的DEFERRABLE束缚.

可是有必然的范围性.外键束缚要求对方针列具有不行耽误的束缚.

The referenced columns must be the columns of a non-deferrable unique
or primary key constraint in the referenced table.

办理要领

题目更新后更新.
假设“序列”在正常操纵中从不用极,您可以停止这样的独一错误:

UPDATE tbl SET "sequence" = ("sequence" + 1) * -1
WHERE  "CableLine" = 2;

UPDATE tbl SET "sequence" = "sequence" * -1
WHERE  "CableLine" = 2
AND    "sequence" < 0;

行使不行耽误的束缚(默认),您必需运行两个单独的事宜才气使其事变.快速持续运行呼吁以停止并发题目.该办理方案显然不得当重载并发负载.

在旁边:
跳过表别名的要害字AS是可以的,可是不提议对列别名执行沟通的操纵.

我提议不要行使SQL要害字作为标识符,纵然这是应承的.

停止这个题目

在更大局限或具有大量并发负载的数据库中,行使serial罗列办行的相对排序更明智.您可以在视图或查询中天生以1开头且没有窗口函数row_number()的间隙的数字.思量这个相干的谜底:
Is it possible to use a PG sequence on a per record label?

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读