将MySQL数据类型的值限制在特定范围内(最好不要使用ENUM)

7

我希望限制字段中存储的数据类型值在一个特定的整数范围内:[0,10]。

在PHP脚本中,用户输入后,我会验证和清理数据,以确保它在0到10的范围内。但是,是否有一种方法可以通过某种数据类型或约束条件来确保这一点存在于投票表中?

目前,我将int值存储在UNSIGNED TINYINT中,其范围为0-255。我知道ENUM是一种选择。然而,据我所知,在使用数字时不建议使用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;

我希望有人能够协助。

这段内容与IT技术无关。
1个回答

12

您可以创建一个允许投票值的表,并在您的投票表中添加一个外键,这样当您尝试插入具有用户投票值的投票时,如果该值不在您的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);

非常感谢您的回复。我甚至没有考虑过通过这种方法限制输入值。 - leokennedy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接