我如何在没有主键的情况下防止重复

时间:2020-05-08 14:09:38

标签: php mysql

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

到目前为止,一切运行顺利,直到有两个用户提交发票,而服务器却打h,并以相同的INVOICE_ID形式写了两个发票。原因是PHP脚本读取INVOICE_ID的MAX INVOICE_TYPE,然后添加 1 ,然后插入带有该INVOICE_ID的新行。本质上,它在编程上是primary key 99.9%的工作时间,但是那一次是一个问题。

我曾尝试找到SQL解决方案,但是对此没有足够的了解。我曾尝试自己在SQL查询中执行此操作以读取MAX,增量和插入,但是仅抛出一个异常,您无法一次选择并从同一张表中插入。

我想知道的是,是否存在一个自动增量,该自动增量可能以INVOICE_TYPE为条件,仅在类型匹配时才自动递增。任何建议都将在这一点上有所帮助。

3 个答案:

答案 0 :(得分:2)

在两列(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

答案 1 :(得分:0)

padding-bottom:25%设为(INVOICE_ID),这将解决您的问题,sql将不允许在同一列中重复值。

答案 2 :(得分:0)

我喜欢的方式是创建一个表来处理所有序列,并创建一个存储过程,可以使用我想知道下一个值的序列名称进行调用,类似于:

开始交易;

从值中取值,如paramSeqName FOR UPDATE;

UPDATE序列SET值=值+ 1 WHERE名称,如paramSeqName;

COMMIT;

这里有一个很好的例子: http://www.microshell.com/database/mysql/emulating-nextval-function-to-get-sequence-in-mysql/