Хотите ограничить значение поля MySQL определенным диапазоном (десятичные значения) - PullRequest
6 голосов
/ 06 марта 2012

Я хочу ограничить значение поля в строке таблицы определенным диапазоном. Можно ли ограничить мое поле отношений_level до [0,00-1,00] ?

В настоящее время я использую DECIMAL (2,2), он не разрешает DECIMAL (1,2), так как M должно быть> = D. Я предполагаю, что тип данных DECIMAL (2,2) фактически позволит значения от 00.00 до 99.99?

CREATE TABLE relationships (
    from_user_id MEDIUMINT UNSIGNED NOT NULL,
    to_user_id MEDIUMINT UNSIGNED NOT NULL,
    relationship_level DECIMAL(2,2) UNSIGNED NOT NULL,
    PRIMARY KEY (from_user_id, to_user_id), 
    FOREIGN KEY (from_user_id) REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE NO ACTION,
    FOREIGN KEY (to_user_id) REFERENCES users (user_id) ON DELETE CASCADE ON UPDATE NO ACTION,
    INDEX relationship_from_to (to_user_id, from_user_id, relationship_level)
) ENGINE = INNODB;

Есть ли лучший способ сделать это, кто-нибудь может предвидеть какие-либо ограничения?

Большое спасибо!

Ответы [ 2 ]

3 голосов
/ 06 марта 2012

Вы можете смоделировать проверочное ограничение в MySQL, используя триггеры.

Например, если вы хотите, чтобы все значения больше 1.00 были сохранены как 1.00, вы можете сделать это с помощью двух триггеров, таких как:

DELIMITER $$

DROP TRIGGER IF EXISTS tr_b_ins_relationships $$

CREATE TRIGGER tr_b_ins_relationships BEFORE INSERT ON relationships FOR EACH ROW BEGIN
  IF new.relationship_level > 1
  THEN
    SET new.relationship_level = 1;
  END IF;
END $$

DELIMITER ;


DELIMITER $$

DROP TRIGGER IF EXISTS tr_b_upd_relationships $$

CREATE TRIGGER tr_b_upd_relationships BEFORE UPDATE ON relationships FOR EACH ROW BEGIN
  IF new.relationship_level > 1
  THEN
    SET new.relationship_level = 1;
  END IF;
END $$

DELIMITER ;
3 голосов
/ 06 марта 2012

На самом деле, DECIMAL(2,2) допускает десятичное число до 2 разрядов, ОБА из которых назначены десятичным разрядам. Максимальное значение для этого поля будет 0.99, а минимальное будет 0.00.

Чтобы ограничить значения от 00.00 до 99.99, используйте DECIMAL(4,2) UNSIGNED.

...