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.
我有 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.