mysql - 将 MySQL 数据类型的值限制在特定范围内(最好不是 ENUM)

标签 mysql enums range sqldatatypes tinyint

我想将可以存储在字段中的数据类型值限制为特定范围的整数值:[0,10]。

在 PHP 脚本中的用户输入中,我验证并清理数据以确保它在 0 到 10 的范围内。但是,有没有办法通过某种数据类型或约束?

目前我将 int 值存储在一个 UNSIGNED TINYINT 中,它的范围当然是 0-255。我知道 ENUM 作为一个选项。但是,我读到使用数字时不可取:http://komlenic.com/244/8-reasons-why-mysqls-enum-data-type-is-evil/

SQL:

CREATE TABLE votes (
vote_id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
article_id MEDIUMINT UNSIGNED NOT NULL,
user_id MEDIUMINT UNSIGNED NOT NULL,
user_vote TINYINT UNSIGNED NOT NULL,
PRIMARY KEY (vote_id),
FOREIGN KEY (article_id) REFERENCES articles (article_id) ON DELETE CASCADE ON UPDATE NO ACTION,
FOREIGN KEY (user_id) REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE NO ACTION,
CONSTRAINT article_uservoted UNIQUE KEY (user_id, article_id),
INDEX vote_value (article_id, user_id, user_vote)
) ENGINE=INNODB;

我希望有人能提供帮助。

最佳答案

您可以创建一个包含允许投票值的表并在您的投票表中添加一个外键,因此当您尝试使用 user_vote 值而不是 allowed_votes 表中存在的投票时,您会收到约束失败错误:

CREATE TABLE allowed_votes (
  vote_rank TINYINT UNSIGNED NOT NULL,
  PRIMARY KEY (vote_rank)
) ENGINE = InnoDB;

INSERT INTO allowed_votes( vote_rank ) VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10);

ALTER TABLE votes
ADD FOREIGN KEY (user_vote) REFERENCES allowed_votes (vote_rank);

关于mysql - 将 MySQL 数据类型的值限制在特定范围内(最好不是 ENUM),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9249695/

相关文章:

php - CSV 到 Mysql 插入日期时间

mysql - SQL for Mere Mortals 第四版 - 更新数据集

java - 以通用方式处理多个枚举类型

java - 带数字键的枚举

python - 读取 python 列表并从给定列表中删除某些数字

mysql - 如何在 Mysql 中取消透视下表? [请求更好的方法]

MySQL - 每3小时的数据平均值?

java - Java 是否支持枚举的非递增值?

python - pd.cut 的令人困惑的结果

php - PHP中数字范围的计算