【问题标题】:Limit the value of a MySQL datatype to a specific range (preferably not ENUM)将 MySQL 数据类型的值限制在特定范围内(最好不是 ENUM)
【发布时间】:2012-03-04 05:10:52
【问题描述】:

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

希望有人能提供帮助。

【问题讨论】:

    标签: mysql enums range sqldatatypes tinyint


    【解决方案1】:

    您可以创建一个允许投票值表并在您的投票表中添加一个外键,因此当您尝试插入一个用户投票值不是您的 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);
    

    【讨论】:

    • 非常感谢您的回复。我什至没有考虑通过这样的方法限制输入值。
    猜你喜欢
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2014-11-07
    • 1970-01-01
    • 2011-05-23
    相关资源
    最近更新 更多