Mysql - 防止重复输入字段中的增量值

Posted

技术标签:

【中文标题】Mysql - 防止重复输入字段中的增量值【英文标题】:Mysql - Prevent duplicate entry for incremental value in a field 【发布时间】:2021-10-27 20:43:56 【问题描述】:

我的网站托管在共享主机中。这是一个 POS 应用程序(php、Codeigniter)。它有几个用户。每个人都在生成发票。发票编号是递增的。也就是说,当用户提交发票表单时,它会获取最后一个发票编号,然后将其加一,然后使用新发票编号创建一个新行。此过程有时(很少)在用户几乎同时提交表单时生成重复的发票编号。

一种可能的方法是使发票独一无二。但如果再次发生,用户将看到异常或格式化错误消息。

我不想向我的用户显示错误。因为当他们提交发票表格时,它包含他们写的销售信息。如果他们因为这个警告而失去它,他们会感到不安。 AJAX 将不起作用。直接提交在这里工作(用于发票提交)。

这种情况可以申请SQL锁吗?我对 SQL 锁定一无所知。

【问题讨论】:

请发布您的代码。 使用自增主键。 自动递增主键已经存在。我正在使用另一列(int)作为发票编号。 是的,codeigniter 有一个功能可以做到这一点。 codeigniter.com/userguide3/database/transactions.html @sukalogika 是否可以在其他用户同时写入表格时阻止其他用户读取最新发票号?我想阻止读取(在写发票时),因为如果用户无法读取,则不会产生重复值。 【参考方案1】:

如果您关心的不是性能,那么一种低效的方法就是 将您的发票编号插入为空/零,然后更新另一个查询

喜欢

INSERT INTO invoices (id, invoice_number) VALUES (10001, null);
UPDATE invoices SET invoice_number = id WHERE invoice_number IS NULL;

对于锁,您可以查看SELECT ... FOR UPDATE,它会锁定最后读取的行,并且来自其他连接的插入也被阻止,但最好在您的数据库上尝试它,因为这取决于您的 mysql 版本和隔离级别设置。

【讨论】:

以上是关于Mysql - 防止重复输入字段中的增量值的主要内容,如果未能解决你的问题,请参考以下文章

C#获取mysql自动增量值[重复]

AUTOINCREMENT 自动增量

将值传递给函数时,GCC前缀增量运算符行为不端[重复]

mySQL 数据库:重置自动增量字段

什么可能导致自动增量主键字段(mysql)上的重复 ID?

获取每行增量值的总和[重复]