【问题标题】:Generate auto transaction id from database mySQL PHP从数据库 mySQL PHP 生成自动事务 ID
【发布时间】:2021-06-29 23:07:46
【问题描述】:

当我通过 PHP 在我的数据库中插入数据时,我正在尝试生成交易编号。 我想生成序列事务 id,以便执行以下 SQL。 我正在计算 ID 列并为新插入添加 +1 值。 但是当我有一个批量插入时,它不会在单个条目之后显示不同的事务 ID。

我希望ALFABHETs 始终保持不变,之后数字将不断运行。 如果达到这个数字,它会自动变成3到4位数字。

例如,数字将从 MG001 开始。如果是MG999,则变为MG1000MG1001MG1002

#table_name: table1

ID | transactionID  
------------------
1  | MG001
2  | MG001
3  | MG003
4  | MG004
5  | MG004
6  | MG001

$stmt = $con->prepare("SELECT * FROM `table1` ORDER BY `ID` DESC LIMIT 1");
$stmt->execute();
if ($stmt->rowCount() > 0) {
    while ($data = $stmt->fetch()) {
        $transactionCode = 'MG' . $data['ID'] + 1;
    }
} else {
    $transactionCode = 'MG001' . '1';
}

【问题讨论】:

  • 我不明白你的问题。您根据数据库中的ID 计算$transactionCode,为什么这会对批量插入造成问题?我假设ID 是您的AUTO_INCREMENT 索引?
  • 这看起来很容易出现race conditions。如果你同时收到两个请求,理论上这两个请求可以获得相同的事务 id。

标签: php transactions auto-generate


【解决方案1】:

您的查询会加载具有最高 ID 的记录,这是一条记录,如果找到则将其加 1。如果没有记录,则使用'MG0011' 作为值。由于您只有一个值,因此如果将其放入批量插入的代码中,那么它将被复制。所以你应该加载transactionID(而不是ID),去掉MG或任何前缀,然后加1。示例:

$stmt = $con->prepare("SELECT * FROM `table1` ORDER BY `ID` DESC LIMIT 1");
$stmt->execute();
if ($stmt->rowCount() > 0) {
    while ($data = $stmt->fetch()) {
        $transactionCode = (int)substr($data['transactionID'], 2) + 1;
    }
} else {
    $transactionCode = 1;
}

上面的代码生成了一个起点,并且(还)不关心您打算使用的格式。现在,让我们实现一个根据需要生成代码的函数:

function generateTransactionCode($input, $prefix = 'MG') {
    while (strlen($input) < 3) $input = '0'.$input;
    return $prefix.$input;
}

现在让我们生成一个批量插入命令(我假设你是auto_incrementID):

$sql = 'insert into table1(transactionID) values';
$values = [];
for ($index = 0; $index < 5; $index++) { //we insert 5 values in this example
    $values[]='('.generateTransactionCode($transactionCode + $index).')';
}
$sql .= implode(',', $values);
//Execute the insert

使用插入选择语句来做这件事更棘手。如果你需要这样做,那么你需要使用row_number

【讨论】:

  • 这是一个非常令人困惑的答案.. 我可以做一个功能吗? > 如果存在则从表中获取事务 id retun 但如何创建此代码
  • 这是正确的做法,请帮助合作https://paiza.io/projects/e/TNwmwVB9rM4KGYrnltejow?theme=ambiance
  • @ShubhamNagar 您可以将所有内容放入一个函数中,但这并不可取,因为为每个原子特征创建函数背后的想法是分离关注点。当我生成事务代码时,目标是确保我不必进行插入。其他功能可能需要在不插入的情况下生成事务代码。如此小而简洁的功能是要走的路。
  • 如何实现目标?
  • @ShubhamNagar 我可以在您提供的链接中看到您共享的代码。该代码正在挖掘一个数字并将 1 添加到 1,以便您获得一个新代码。所以,问题是:您现在尝试应用我的解决方案时遇到的确切障碍是什么?让我们一个一个地移除拦截器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-25
  • 1970-01-01
  • 2014-04-16
相关资源
最近更新 更多