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关键字作为标识符,即使这是允许的. 避免这个问题 在更大规模或具有大量并发负载的数据库中,使用 (编辑:均轻资讯网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- sql-server-2008 – SQL Server:锁定通信缓冲区资源死锁
- 日志文件 – SQL Server维护计划:重建索引和事务日志备份文
- sql-server – uncoditioned Count(*)vs System表
- SQL Azure备份和还原策略
- sql-server – 执行计划与STATISTICS IO订单
- sql-server – 尝试读取或写入连接到SQL Server的受保护内存
- sqlserver得到当前日期的最大时间值
- SQL Server中怎么样实现数字辅助表?一文带你看懂
- 创建couchdb数据库备份的最少侵入性方法是什么?
- HTML教程:收集的常用的HTML标签(5)


