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

leo*_*edy 5 mysql enums range tinyint sqldatatypes

我想将可以存储在字段中的数据类型值限制为特定范围的整数值:[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;
Run Code Online (Sandbox Code Playgroud)

我希望有人可以提供帮助.

pio*_*trm 9

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

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);
Run Code Online (Sandbox Code Playgroud)