SQL 列数据类型没有限制

No limitation on SQL column data type

我有 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 列设置为整数且最大值为 100? 为什么我只能输入 100,却能输入 101?

当您将列定义为 INTEGER(100) 或在括号内使用任何其他值时,不会对该列的值创建任何约束。
事实上 SQLite 完全忽略它。

SQLite 甚至不检查列的数据类型,因此您可以在定义为 INTEGER 的列中插入非数字字符串而不会出现任何错误。

同样适用于STRING(10),因为SQLite中没有STRING数据类型,但是你应该使用TEXT.

这一切在Datatypes In SQLite中解释得很清楚。

如果要创建此类约束,则必须明确定义 CHECK constraints,例如:

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) 
);

查看简化版 demo.