使用 IBM Informix 数据库。如果我手动指定 order_no,该语句有效,但如果我尝试在查询中递增它,它就会失败。
表结构
patkey serial
notetype char(4)
order_no int
约束是 patkey、notetype 和 order_no
我可以手动插入运行以下命令并增加 order_no
insert into patnotes (patkey, notetype, order_no) values (5000, 'GEN', 3)
我想在插入语句中增加它,但我得到了重复的违规并且不明白如何。
这是我试图用来增加 order_no 的插入语句。
INSERT INTO patnotes (patkey, notetype, order_no)
SELECT FIRST 1
p.personkey,
'GEN' as notetype,
CASE WHEN n.order_no is null then 1 else (n.order_no + 1) end as order_no
FROM
person p
LEFT JOIN
patnotes n
ON p.personkey = n.patkey
AND n.notetype = 'GEN'
WHERE
p.patid = '5000'
ORDER BY
n.order_no DESC
检查表是否存在以下条目
5000, GEN, 1
5000, GEN, 2
下一个顺序应该是 3。
运行上述插入语句的选择部分给出:
5000, GEN, 3
这是正确的,但不符合约束条件。如果我在第一个插入语句中手动输入这些,就没有问题。
现在下一个奇怪的问题是,如果我清除这些条目,那么第一个条目是 order_no 1。
这将为 order_no 1 和 2 添加条目,但对于 3+ 会失败,但如果我仅在插入语句中手动指定它,则没有问题。
我没有看到我错过的东西
假设您使用的是最新的 12.10 Informix 版本,在线文档指出:
上下文中使用的语句
FIRST
不支持So。但是在查询中使用不会给出任何语法错误,所以可能发生了其他事情。SELECT
INSERT
FIRST
当我们运行上面的代码时,
INSERT
我们得到:如果我们删除
UNIQUE
约束并运行INSERT
多次,我们将始终获得相同的 column 值order_no
。它不断插入相同的计算值
order_no
。似乎是一个错误。您应该使用 Informix 支持打开缺陷。作为解决方法,您可以使用
MAX
来计算order_no
:请注意,如果您有多个会话试图同时插入新值,这种方法将失败得很惨。您应该使用
SERIAL
或创建一个SEQUENCE
来生成order_no
值。