【问题标题】:SQL constraint for column列的 SQL 约束
【发布时间】:2013-10-05 03:57:24
【问题描述】:

我有一个名为 NumberInStock 的列。但是,在数据库中,我想将可以输入到该列中的值限制在 1 到 100 之间。我将在该列上使用什么约束,这将是 SQL 查询的正确语法吗?到目前为止我得到的是:

ALTER TABLE Inventory
ALTER COLUMN NumberInStock 

现在我要放什么来放置约束以及我将使用什么约束

我正在使用具有 1999 ANSI/ISO 标准的 MySQL。

【问题讨论】:

  • 您必须告诉我们您使用的是哪个 DBMS。
  • 刚刚将我正在使用的 DBMS 添加到帖子中
  • MySQL 确实支持检查约束。即使它会接受来自已接受问题的 SQL,它也会默默地忽略它!
  • 在 DBS.SE 上查看这个问题:check constraint does not work? 给出了 2 个选项/解决方法,使用触发器或引用表的外键(第二个适合仅在某些情况下)。
  • domecraft 检查我的答案。

标签: mysql sql ansi-sql


【解决方案1】:

通常这类问题应该使用 CHECK 约束来解决,如下所示-

ALTER TABLE Inventory ADD CONSTRAINT chk1 CHECK(NumberInStock BETWEEN 1 AND 100);

这可以在 ORACLE 中完成,但是 MySQL 有一个关于检查约束实施的 BUG reported

因此,您必须在该表上实现两个触发器,即一个用于 INSERT,另一个用于 UPDATE

【讨论】:

  • 非常感谢!我知道 MySQL 的行为很奇怪,但我意识到这是因为我使用的是针对 Oracle 的查询,而我从未意识到 MySQL 的语法会如此不同。
  • 您可以简单地将 MySQL 视为具有 ORACLE 功能的 DBMS。毕竟它被广泛用于许多企业应用程序中,ORACLE 和 MySQL 都来自 ORACLE 公司。
【解决方案2】:

使用检查约束。

ALTER TABLE <TABLE NAME>
ADD CONSTRAINT <CONSTRAINT NAME> CHECK(<PREDICATE> OR/AND/NOT <PREDICATE> ...)

【讨论】:

  • 感谢您的回答。我尝试在网上查找它,但我找不到任何关于它的信息。
  • 在 MySQL 中,CHECK 约束被解析为语法正确,然后忽略。不会对值进行检查!
猜你喜欢
  • 1970-01-01
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
  • 2012-07-25
  • 1970-01-01
  • 1970-01-01
  • 2022-11-17
  • 2021-04-10
相关资源
最近更新 更多