【问题标题】:How to restrict a column value in SQLite / MySQL如何限制 SQLite / MySQL 中的列值
【发布时间】:2011-09-16 01:27:09
【问题描述】:

我想限制 SQL 表中的列值。例如,列值只能是“car”或“bike”或“van”。我的问题是如何在 SQL 中实现这一点,在 DB 端这样做是个好主意还是应该让应用程序限制输入。

我还打算在未来添加或删除更多值,例如“卡车”。

我使用的数据库类型是 SQLite 和 MySQL。

【问题讨论】:

    标签: mysql sqlite restriction


    【解决方案1】:

    添加一个包含这些交通工具的新表,并使您的列成为该表的外键。将来可以将新的交通工具添加到表格中,并且您的列定义保持不变。

    有了这种结构,我肯定会选择在数据库级别而不是在应用程序级别进行规范。

    【讨论】:

    • 我最喜欢这个——这是唯一一个满足“将来添加更多类型”要求而不更改数据库的答案(只需插入新行)
    • 同意,数据不是静态的事实证实它应该是一个查找表而不是CHECK 约束或等效项。是的,这个数据约束应该在数据库中建模。
    【解决方案2】:

    对于 MySQL,您可以使用 ENUM 数据类型。

    column_name ENUM('small', 'medium', 'large')

    MySQL Reference: The ENUM Type

    除此之外,我发现在应用程序端限制数据库端 AND 总是更好。一个 Enum 加上一个 Select 框,你就被覆盖了。

    【讨论】:

    • 这很难满足“将来添加更多类型”的要求 - 你必须进行数据库更改。询问 DBA 他对此有多激动。
    • 您没有提到不想打扰可怜的 DBA 添加更多项目。也许您应该在问题中指定这一点。
    • 我没有问这个问题。我只是评论你的回答。不过我没有投反对票:)
    • 我的错误。如果评论听起来有点刻薄,我深表歉意,但我想不同的人有不同的定义。我 100% 同意接受的答案(并赞成),并发现以编程方式允许添加值将是最好的解决方案,但作为一名编码人员,我最终只会修改数据库,如果它不是结束- 面向用户的功能。
    • 使用 ORM 层实现此功能时,可以通过迁移轻松更改。通过 git 正确跟踪我发现这是一个很好的解决方案,可以实现和跟踪在数据库本身中实现的值限制。
    【解决方案3】:

    是的,建议添加检查约束。检查约束用于确保数据库中数据的有效性并提供数据完整性。如果在数据库级别使用它们,使用数据库的应用程序将无法添加无效数据或修改有效数据,从而使数据变为无效,即使应用程序本身接受无效数据也是如此。

    在 SQLite 中:

    create table MyTable
    (
        name string check(name = "car" or name = "bike" or name = "van")
    );
    

    在 MySQL 中:

    create table MyTable
    (
        name ENUM('car', 'bike', 'van')
    );
    

    【讨论】:

    • 在 SQLite 中,你可以说check("name" in ('car', 'bike', 'van'))。另外:"-quotes 用于标识符,'-quotes 用于文字值。
    【解决方案4】:

    您将使用检查约束。在 SQL Server 中它是这样工作的

    ALTER TABLE Vehicles
    ADD CONSTRAINT chkVehicleType CHECK (VehicleType in ('car','bike','van'));
    

    我不确定这是否是 ANSI 标准,但我确信 MySQL 有类似的构造。

    【讨论】:

    • 缺少右括号?
    【解决方案5】:

    如果您想使用 DB 端验证,您可以使用触发器。对于 SQLite,请参见 this,对于 MySQL,请参见 detailed how-to

    所以问题实际上是您是否应该使用数据库验证。如果您有多个客户端——无论它们是不同的程序,还是多个用户(可能有不同版本的程序)——那么走数据库路线绝对是最好的。数据库(希望)是集中式的,因此您可以解耦验证的一些细节。在您的特定情况下,您可以验证插入列中的值是否包含在一个单独的表中,该表仅列出有效值。

    另一方面,如果您对数据库缺乏经验,计划针对多个不同的数据库,并且没有时间开发专业知识,那么简单的应用程序级验证可能是最方便的选择。

    【讨论】:

      猜你喜欢
      • 2021-12-09
      • 1970-01-01
      • 1970-01-01
      • 2017-07-22
      • 2019-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多