我正在嘗試為 id(長度為 5 位)創建約束,其中第 5 位是值的最后一位(1 x d1 3 x d2 1 x d3 3 x d4)。例如,如果 id 的前四個字符是 1234,那么第五個數字是 (1x1 3x2 1x3 3x4) = 22 的最后一個數字,導致 d5 = 2 的校驗位。因此 id = 12342。
這是我的代碼;
CREATE TABLE GameLicense_16 (
title TEXT,
release_year INTEGER,
platform TEXT,
license_id INTEGER PRIMARY KEY
CHECK (LENGTH(license_id) == 5)
CHECK ((substr (license_id, 5, 1)) = substr (CAST ((substr (license_id, 1, 1) BETWEEN 0 AND 9)
AS int)
3* CAST ((substr (license_id, 2, 1) BETWEEN 0 AND 9) AS int)
1* CAST ((substr (license_id, 3, 1) BETWEEN 0 AND 9) AS int)
3* CAST ((substr (license_id, 4, 1) BETWEEN 0 AND 9) AS int),2,1))
);
但是當我嘗試使用12342的許可證ID進行測驗時,它給了我約束失敗的錯誤訊息,這意味著計算在某處是錯誤的,但我無法弄清楚。
uj5u.com熱心網友回復:
由于您定義license_id為INTEGER PRIMARY KEY,因此無需通過檢查其每個字符來檢查您插入的值是否為整數... BETWEEN 0 AND 9。
事實上,這是 SQLite 強制型別檢查的唯一情況,因此您可以確定非整數值將被拒絕。
同樣在您的代碼中,您正在混合布爾運算式并且substring()沒有意義。
只關注檢查約束規則,可以這樣做:
CREATE TABLE GameLicense_16 (
title TEXT,
release_year INTEGER,
platform TEXT,
license_id INTEGER PRIMARY KEY
CHECK (LENGTH(license_id) == 5)
CHECK (
SUBSTR(license_id, 5, 1) 0 = (
SUBSTR(license_id, 1, 1) 3 * SUBSTR(license_id, 2, 1)
SUBSTR(license_id, 3, 1) 3 * SUBSTR(license_id, 4, 1)
) % 10
)
);
請參閱演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/325071.html
