【问题标题】:Range constraint numeric MySQL column: how?范围约束数字 MySQL 列:如何?
【发布时间】:2013-04-02 07:01:36
【问题描述】:

我可以在 MySQL 数字列 (InnoDB) 上定义一个约束,只允许特定范围内的值吗?

例如此表中的列wavelength

CREATE TABLE spectrumdata
(
  valueid INT AUTO_INCREMENT,
  spectrumset INT NOT NULL,
  wavelength DOUBLE NULL,
  intensity DOUBLE NULL,
  error INT NOT NULL,
  status INT NOT NULL,
  PRIMARY KEY (valueid),
  INDEX spectrumset_idx (spectrumset),
  CONSTRAINT spectrumset_fk FOREIGN KEY (spectrumset)
    REFERENCES spectrumsets (setid)
)
COLLATE=utf8_general_ci
ENGINE=InnoDB
ROW_FORMAT=DEFAULT
AUTO_INCREMENT=1;

【问题讨论】:

  • 您在使用 InnoDB 先生吗?
  • 由于 MySQL 是极少数不支持检查约束的 DBMS 之一,您唯一的机会就是使用触发器。
  • @BlackHatShadow 是的,忘了说,对不起
  • 没关系。试试我的回答。我不知道你桌子的全部规格,但这可能会有所帮助。

标签: mysql


【解决方案1】:

如果您使用 InnoDB 作为引擎先生,您可以check this out。如您所见,您可以创建一个新表,其中包含您的限制值和对您的字段的引用(作为外键),然后它现在以引用完整性强制执行您的约束。

更新

试试这个:

   CREATE TABLE allowed_val(
      limiting_val DOUBLE NOT NULL,
      PRIMARY KEY (limiting_val )
    ) ENGINE = InnoDB;

INSERT INTO allowed_val( limiting_val) VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),..(1000);

ALTER TABLE spectrumdata
ADD FOREIGN KEY (wavelength) REFERENCES allowed_val(limiting_val);

但您还必须将spectrumdata 波长更改为NOT NULL 为DEFAULT = 0;处理空值。

【讨论】:

  • 谢谢。但这是一种解决方法,我想知道是否有办法通过数据定义语句强制它,但似乎没有。我找到了CHECK 子句,但文档说:“CHECK 子句已解析但被所有存储引擎忽略”。见:dev.mysql.com/doc/refman/5.6/en/create-table.html
  • 另外,您的解决方案不适用于双精度值,仅适用于整数。不过还是谢谢
猜你喜欢
  • 2022-06-17
  • 2015-06-21
  • 2010-09-27
  • 2017-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多