【问题标题】:No limitation on SQL column data typeSQL 列数据类型无限制
【发布时间】:2022-01-06 18:21:23
【问题描述】:

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

【问题讨论】:

    标签: sqlite create-table check-constraints


    【解决方案1】:

    当您将列定义为 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

    【讨论】:

      猜你喜欢
      • 2021-04-27
      • 1970-01-01
      • 2012-07-19
      • 2021-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      相关资源
      最近更新 更多