我需要生成一個由任意前綴、年份和遞增數字組成的代碼。遞增的數字必須在當年生成數字時第一次從 1 開始。
此代碼需要添加到 sqlite 資料庫,并在 PHP 腳本的其他地方可用。
我現在所做的使用對資料庫的 4 次訪問:
$codePrefix = 'TEST';
$stmt = $db->prepare(
'INSERT INTO test (year)
VALUES(strftime("%Y", "now"))'
);
$stmt->execute();
$id = $db->lastInsertId();
$stmt = $db->prepare('SELECT `year` FROM `test` WHERE `id`=:id');
$stmt->bindValue(':id', $id);
$stmt->execute();
$result = $stmt->fetch(PDO::FETCH_ASSOC);
$year = $result['year'];
$stmt = $db->prepare('SELECT Ifnull(Max(id), 0) `max_id` FROM `test`
WHERE `year`<:year');
$stmt->bindValue(':year', $year);
$result = $stmt->execute();
$result = $stmt->fetch(PDO::FETCH_ASSOC);
$previousMax = $result['max_id'];
$codeSuffix = $id-$previousMax;
$code = "{$codePrefix}-{$year}-{$codeSuffix}";
$stmt = $db->prepare('UPDATE `test` SET `code`=:code WHERE `id`=:id');
$stmt->bindParam(':code', $code);
$stmt->bindParam(':id', $id);
$stmt->execute();
在這里,我濫用的id是一個整數主鍵和自動增量的事實。
這有效。但我覺得它以一種非常復雜的方式在做一些非常簡單的事情。
有更好的解決方案嗎?我需要假設一月一日的午夜可能發生在代碼的任何時刻,因此我無法在不訪問資料庫的情況下執行諸如從 PHP 獲取年份資訊之類的操作。
在有人問之前,即使沒有系結值,我也使用準備好的陳述句的原因是因為稍后顯然會有更多資料插入表中。
uj5u.com熱心網友回復:
考慮使用ROW_NUMBER視窗函式的純 SQL 解決方案。下面分配給新欄位new_id:
UPDATE test
SET new_id = 'TEST_' || test.[Year] || '_' || sub.rn
FROM (
SELECT id,
[Year],
ROW_NUMBER() OVER (PARTITION BY [Year] ORDER BY id) AS rn
FROM test
) AS sub
WHERE test.id = sub.id;
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/382491.html
