我有一个名为INVOICES
的表,该表从PHP脚本接收条目。它具有许多列,但最相关的两个是INVOICE_ID
和INVOICE_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
为条件,仅在类型匹配时才自动递增。任何建议都将在这一点上有所帮助。
答案 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/