mysql中没有主键如何防止重复

INVOICES我有一个名为从 PHP 脚本接收条目的表。它有很多列,但最相关的两个是INVOICE_IDINVOICE_TYPE。基本上是一个从03INVOICE_TYPE的数字,它指定不同类型的发票。

至此,一切都进行得很顺利,直到两个用户提交了发票,而服务器却出现了问题,将两者写入了 as same INVOICE_ID。这样做的原因是 PHP 脚本读取 的 MAX INVOICE_IDINVOICE_TYPE然后加1,然后用它插入新行INVOICE_ID。本质上,它以编程方式是一个primary key99.9%的时间都有效,但有一次是个问题。

我曾尝试寻找 SQL 解决方案,但对它的了解不足。我曾尝试在 SQL 查询中自己执行此操作以读取 MAX、增量和插入,但只是抛出一个异常,您无法立即从同一个表中选择和插入。

我想知道的是,是否有一个自动递增可以以INVOICE_TYPE, 为条件,只有在类型匹配时才递增。此时任何建议都会有所帮助。


PIPIONE
浏览 187回答 4
4回答

aluckdog

两列上的唯一索引(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);  -- okayINSERT INTO INVOICES (INVOICE_ID, INVOICE_TYPE) VALUES (1, 5);  -- error

30秒到达战场

如果一次只向一张表插入一行,最简单的解决方案是在两列上应用唯一索引。CREATE UNIQUE INDEX invoice_id_type_uniqueON 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 DATACOMMIT;

蛊毒传说

make (INVOICE_ID)as UNIQUE,这将解决您的问题,sql 不允许同一列中的重复值。

MMTTMM

我喜欢的方式是创建一个表来处理所有序列和一个存储过程,我可以用我想知道下一个值的序列名称调用它,类似于:开始交易;SELECT value INTO result FROM Sequences WHERE name like paramSeqName FOR UPDATE;更新序列 SET value = value + 1 WHERE name like paramSeqName;
打开App,查看更多内容
随时随地看视频慕课网APP