Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SQLite/MySQL中限制列值_Mysql_Sqlite_Restriction - Fatal编程技术网

如何在SQLite/MySQL中限制列值

如何在SQLite/MySQL中限制列值,mysql,sqlite,restriction,Mysql,Sqlite,Restriction,我想限制SQL表中的列值。例如,列值只能是car、bike或van。我的问题是如何在SQL中实现这一点,在DB端这样做是一个好主意,还是应该让应用程序限制输入 我还打算在将来添加或删除更多值,例如,truck 我使用的数据库类型是SQLite和MySQL。对于MySQL,可以使用ENUM数据类型 列名枚举“小”、“中”、“大” 看 此外,我发现在DB端和应用端进行限制总是更好的。一个枚举加上一个选择框,您就被覆盖了。如果您想进行DB端验证,可以使用触发器。请参阅SQLite,这是MySQL 所以

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

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


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

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

列名枚举“小”、“中”、“大”


此外,我发现在DB端和应用端进行限制总是更好的。一个枚举加上一个选择框,您就被覆盖了。

如果您想进行DB端验证,可以使用触发器。请参阅SQLite,这是MySQL

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


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

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

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

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

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


有了这种结构,我最终会选择在DB级别而不是在应用程序级别进行调节。

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

在SQLite中:

create table MyTable
(
    name string check(name = "car" or name = "bike" or name = "van")
);
在MySQL中:

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

我最喜欢这一点——这是唯一能够满足将来添加更多类型而不进行db更改的答案——只需插入一个新行即可。同意,数据不是静态的事实证明它应该是一个查找表,而不是检查约束或等效项。是的,这个数据约束应该在数据库中建模。这很难满足将来轻松添加更多类型的要求-您必须更改数据库。询问DBA对此会有多激动。你没有提到你不想让可怜的DBA添加更多项目。也许你应该在问题中说明,我没有问这个问题。我只是在评论你的回答。但我没有投反对票:我的错误。如果这个评论听起来有点刺耳,我很抱歉,但我想不同的人有不同的定义。我100%同意接受的答案,并对其进行了投票,发现以编程方式允许添加值将是最好的解决方案,但作为一名编码人员,如果DB不是面向最终用户的功能,我最终只会修改它。当使用ORM层实现此功能时,可以通过迁移轻松更改。通过git适当跟踪我发现这是一个很好的解决方案,可以实现并跟踪数据库本身中实现的值限制。缺少右括号吗?在SQLite中,可以在“car”、“bike”、“van”中说checkname。另外:-引号表示标识符,-引号表示文字值。