我有 SQLite 資料庫(在 SQLiteStudio 中創建)。
DDL 是這樣的:
CREATE TABLE player (
player_id INTEGER PRIMARY KEY ASC AUTOINCREMENT
UNIQUE
NOT NULL,
first_nickname STRING (10) NOT NULL,
health INTEGER (100) NOT NULL,
gold INTEGER (99) NOT NULL,
silver INTEGER (99) NOT NULL,
bronze INTEGER (99) NOT NULL,
gerium INTEGER (99) NOT NULL
);

預期:我不應該能夠將大于 100 的整數插入health列中。
會發生什么:出于某種原因,我可以插入大于 100 的數字
為什么我能...
INSERT INTO player (first_nickname, health, gold, silver, bronze, gerium) VALUES ('Foo', 101, 0, 0, 15, 0)
...如果我health的列設定為 INTEGER,最大值為 100?為什么我應該只能輸入 100 卻可以插入 101?

uj5u.com熱心網友回復:
當您將列定義為INTEGER(100)或使用括號內的任何其他值時,這不會為列的值創建任何約束。
事實上 SQLite 完全忽略了它。
SQLite 甚至不檢查列的資料型別,因此您可以在定義為INTEGER沒有任何錯誤的列中插入非數字字串。
這同樣適用于 SQLite 中STRING(10)沒有STRING資料型別,但您應該使用TEXT.
所有這些都在 SQLite中的Datatypes 中清楚地解釋了。
如果要創建此類約束,則必須顯式定義CHECK 約束,例如:
CREATE TABLE player (
player_id INTEGER PRIMARY KEY ASC AUTOINCREMENT NOT NULL,
first_nickname TEXT NOT NULL CHECK(LENGTH(first_nickname) <= 10),
health INTEGER NOT NULL CHECK(health BETWEEN 0 AND 100),
gold INTEGER NOT NULL CHECK(gold BETWEEN 0 AND 99),
silver INTEGER NOT NULL CHECK(silver BETWEEN 0 AND 99),
bronze INTEGER NOT NULL CHECK(bronze BETWEEN 0 AND 99),
gerium INTEGER NOT NULL CHECK(gerium BETWEEN 0 AND 99)
);
查看簡化的演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/405696.html
標籤:
