Ограничьте значение типа данных MySQL определенным диапазоном (предпочтительно не ENUM) - PullRequest
5 голосов
/ 12 февраля 2012

Я хочу ограничить значение типа данных, которое можно сохранить в поле, определенным диапазоном целочисленных значений: [0,10].

При вводе пользователем скрипта PHP я проверяю и дезинфицирую данные, чтобы убедиться, что они находятся в диапазоне от 0 до 10. Однако есть ли способ убедиться, что это остается верным в самой таблице голосований через какой-либо тип данных ограничение

В данный момент я храню значение int в неподписанном 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;

Я надеюсь, что кто-то может помочь.

1 Ответ

9 голосов
/ 12 февраля 2012

Вы можете создать таблицу разрешенных значений голосов и добавить внешний ключ в свою таблицу голосов, так что при попытке вставить голос с значением 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);
...