4 回答
TA贡献1847条经验 获得超7个赞
两列上的唯一索引(INVOICE_ID, INVOICE_TYPE)将使此类打嗝查询之一失败。
CREATE UNIQUE INDEX id_type_unique ON INVOICES (INVOICE_ID, INVOICE_TYPE);
INSERT INTO INVOICES (INVOICE_ID, INVOICE_TYPE) VALUES (1, 5); -- okay
INSERT INTO INVOICES (INVOICE_ID, INVOICE_TYPE) VALUES (1, 5); -- error
TA贡献1828条经验 获得超6个赞
如果一次只向一张表插入一行,最简单的解决方案是在两列上应用唯一索引。
CREATE UNIQUE INDEX invoice_id_type_unique
ON INVOICES(INVOICE_ID,INVOICE_TYPE);
但是,如果您基于相同的数据执行更多查询,则需要使用事务来防止仅修改/插入部分数据。
START TRANSACTION;
SELECT @invoice_id:=MAX(INVOICE_ID) FROM INVOICES WHERE INVOICE_TYPE=1;
INSERT INTO INVOICES (...,@invoice_id,...);
...
... #OTHER QUERIES UPDATING DATA
COMMIT;
TA贡献1869条经验 获得超4个赞
我喜欢的方式是创建一个表来处理所有序列和一个存储过程,我可以用我想知道下一个值的序列名称调用它,类似于:
开始交易;
SELECT value INTO result FROM Sequences WHERE name like paramSeqName FOR UPDATE;
更新序列 SET value = value + 1 WHERE name like paramSeqName;
- 4 回答
- 0 关注
- 186 浏览
添加回答
举报