【发布时间】:2017-11-15 13:20:10
【问题描述】:
我有一张如下所示的表格:
CREATE TABLE SCHEDULE (
RCDNO INTEGER NOT NULL,
MASTCONNO INTEGER NOT NULL,
ROWNO INTEGER DEFAULT 0 NOT NULL,
EDITTIMESTAMP TIMESTAMP
)
ALTER TABLE SCHEDULE ADD CONSTRAINT PK_SCHEDULE PRIMARY KEY (RCDNO);
CREATE UNIQUE INDEX IDX_SCHEDULE_3 ON SCHEDULE (MASTCONNO, ROWNO);
我可以运行这样的查询:
select mastconno, rowno, rcdno, edittimestamp
from schedule
where mastconno = 12
order by rowno desc
我明白了:
由于应用程序代码中的错误,edittimestamp 的时间部分丢失了,但这在这里无关紧要。尽管如此,这些记录仍按 ROWNO 的条目顺序列出。这张桌子的设计就是为了方便这一点。
我试图做的是这个......
update SCHEDULE
set ROWNO = (ROWNO + 1)
where MASTCONNO = 12
...在准备插入新的 ROWNO=0 记录时,我收到此错误:
attempt to store duplicate value (visible to active transactions) in unique index "IDX_SCHEDULE_3".
Problematic key value is ("MASTCONNO" = 12, "ROWNO" = 3).
顺便说一句,我在 MS SQL Server 中有一个精确的表副本,我在那里没有这个问题。这似乎特定于 Firebird 的工作方式。
然后我尝试了这个,希望 Firebird 以非违规的顺序将来自 IN 谓词的值“提供”给 UPDATE。
update SCHEDULE
set ROWNO = (ROWNO + 1)
where MASTCONNO = 12 and
ROWNO in (select ROWNO from SCHEDULE
where MASTCONNO = 12 order by ROWNO DESC)
遗憾的是反应和以前一样。更新语句正在复制 ROWNO 3。
【问题讨论】:
-
你的 firebird 版本是什么?您是否有保证,当您更改表时,没有任何其他应用程序会插入新记录?通常 SQL 用于许多用户
-
为了记录,我使用的是2.5
标签: firebird firebird2.5 unique-index