在此代码中,在向DB中插入值之后。我正在执行选择查询以选择invoiceNo($ sql1 =“通过invoiceID desc限制1从发票顺序中选择invoiceNo”;)。而不是从DB中选择如何获取InvoiceNo?
例如:假设有两个用户。两个用户同时插入InvoiceID。执行“从发票顺序中按发票ID Des Limit 1选择发票No.”时,这将获得最后一个发票ID。我需要获取特定的发票ID( (针对特定用户)。如何获取?
$query = "select * from invoices order by invoiceID desc limit 1";
$result = $link->query($query);
$row = $result->fetch_assoc();
$invoiceNo = $row["invoiceNo"];
$getinvoiceNo = str_pad($invoiceNo + 1, 4, 0, STR_PAD_LEFT); //inserting like 0000
$sql = "INSERT INTO invoices (invoiceNo)
VALUES ('$getinvoiceNo')";
if ($link->query($sql) === TRUE) {
//echo "1";
$sql1 = "select invoiceNo from invoices order by invoiceID desc limit 1";
$last_id = mysqli_insert_id($link, $sql1);
$result1 = mysqli_query($link, $sql1);
$row1 = mysqli_fetch_array($result1);
echo json_encode($row1);
} else {
echo "ERROR: Could not able to execute $sql. " . mysqli_error($link);
}
mysql_close($link);
答案 0 :(得分:1)
如果我正确理解了您的问题,那么您担心记录的并发更新可能会破坏数据。
我认为您应该看看mysql SELECT ... FOR UPDATE的语法,它应该按照您的要求进行操作:锁定选定的行,直到触发更新为止。然后锁将被释放。
例如:
SELECT table_field FROM table_name WHERE table_id_field = id_param FOR UPDATE
将锁定选定的行,直到
UPDATE table_name SET table_field = table_field + 1 WHERE table_id_field = id_param
答案 1 :(得分:0)
如果要防止发票编号冲突,只需将表创建为
CREATE TABLE invoices (
invoiceID INTEGER NOT NULL AUTO_INCREMENT,
other columns . . .
PRIMARY KEY (invoiceID)
);
然后,当您执行INSERT时,请勿插入invoiceID并让MySQL执行。
这将确保每个新发票都有唯一的发票ID。