如何在SQLite / MySQL中限制列值

时间:2011-06-16 04:21:48

标签: mysql sqlite restriction

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

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

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

5 个答案:

答案 0 :(得分:32)

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

通过这种结构,我明确地选择在数据库级别而不是应用程序中对此进行管理。

答案 1 :(得分:22)

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

  

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

请参阅MySQL Reference: The ENUM Type

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

答案 2 :(得分:8)

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

在SQLite中:

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

在MySQL中:

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

答案 3 :(得分:4)

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

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

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

答案 4 :(得分:2)

如果您想使用数据库端验证,则可以使用触发器。对于SQLite,请参阅this,对于MySQL,请参阅此detailed how-to

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

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