【问题标题】:SQL Integer Range When Creating Tables创建表时的 SQL 整数范围
【发布时间】:2013-04-10 23:54:35
【问题描述】:

我试图在我的一个创建语句中为我的 INT 提供一系列可能的值,即

创建表站点( **SiteID INT (1,4),** UserID INT UNSIGNED 不为空, 名称 varchar(128) 唯一非空, 外键(UserID)引用用户(UserID), 主键 (SiteID) );

我忘记了您用于范围的语法,而且我很确定我在尝试按原样使用它时会出错。

【问题讨论】:

  • 如果它是你的主键,你为什么要一个范围?
  • 在这种情况下,SiteID 是指站点中某人拥有的权限级别,其中 1 = 管理员,2 = 第二大权力,3 = 第三大权力,4 = 第四大权力。
  • 这就是外键的用途。
  • @OldProgammer,谢谢。这样就解决了。

标签: mysql integer range


【解决方案1】:

作者注:此答案的前两部分不正确。我认为 MySQL 支持 CHECK 约束,但它没有。还是不行。要将列限制为简单的值列表,请在此答案末尾使用 ENUM 方法。如果逻辑更复杂(值范围、基于另一列的值等),唯一的 MySQL 选项是触发器。


如果是INT,则需要CHECK 约束:

CREATE TABLE Site (
  SiteID INT,
  CONSTRAINT SiteID_Ck CHECK (SiteID IN (1, 2, 3, 4)),
  ... and the rest

或者:

CREATE TABLE Site (
  SiteID INT,
  CONSTRAINT SiteID_Ck CHECK (SiteID BETWEEN 1 AND 4),
  ... and the rest

或者,如果您可以使用字符串 SiteID,那么:

CREATE TABLE Site (
  SiteID ENUM('1', '2', '3', '4'),
  ... and the rest

【讨论】:

  • 看起来 CHECK 在 MySQL 中实际上不起作用:“CHECK 子句已解析但被所有存储引擎忽略。” dev.mysql.com/doc/refman/5.0/en/create-table.html
  • 你说得对,杰克,感谢您指出这一点。我不记得回答这个问题了,因为它已经很久了,但是在那个时候,我只是在使用了多年的 Oracle 和 SQL Server 之后才涉足 MySQL。后来我发现它不支持 CHECK 约束。发现很难相信,但 2 年以上仍然没有。很好奇,因为我认为它比 PK 或 FK 更容易实现。尽管如此,最后一个选项(ENUM)仍然有效。我添加了免责声明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多