如何在SQLite/MySQL中限制列值

Mar*_*aro 20 mysql sqlite restriction

我想限制SQL表中的列值.例如,列值只能是"car"或"bike"或"van".我的问题是你如何在SQL中实现这一点,并且在数据库方面这样做是一个好主意,或者我应该让应用程序限制输入.

我还打算将来添加或删除更多值,例如"truck"

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

NGL*_*GLN 33

添加包含这些传输方式的新表,并使列成为该表的外键.将来可以在表中添加新的传输方式,并且列定义保持不变.

有了这种结构,我肯定会选择在数据库级别而不是应用程序级别对此进行管理.

  • 我最喜欢这个 - 它是唯一能满足"在未来添加更多类型"而不进行数据库更改(仅插入新行)的要求的答案 (2认同)

nag*_*eeb 23

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

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

请参阅MySQL参考:ENUM类型

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

  • 您没有提到您不想通过添加更多项目来打扰可怜的DBA.也许你应该在问题中指明. (4认同)
  • 这很难满足"在未来添加更多类型"的要求 - 您必须进行数据库更改.问DBA他对此有多激动. (2认同)

Ale*_*Aza 8

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

在SQLite中:

create table MyTable
(
    name string check(name = "car" or name = "bike" or name = "van")
);
Run Code Online (Sandbox Code Playgroud)

在MySQL中:

create table MyTable
(
    name ENUM('car', 'bike', 'van')
);
Run Code Online (Sandbox Code Playgroud)


Bob*_*bst 5

您将使用检查约束。在SQL Server中,它的工作方式如下

ALTER TABLE Vehicles
ADD CONSTRAINT chkVehicleType CHECK (VehicleType in ('car','bike','van'));
Run Code Online (Sandbox Code Playgroud)

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