想要将MySQL字段的值限制为特定范围(十进制值)

leo*_*edy 6 mysql decimal database-schema sqldatatypes

我想将表格行中的字段值限制为特定范围.是否可以将我的relationship_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;
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来做到这一点,谁能预见到任何限制?

非常感谢!

Ike*_*ker 3

您可以使用触发器在 MySQL 中模拟检查约束。

例如,如果您想强制所有大于 1.00 的值存储为 1.00,您可以使用 2 个触发器来实现,如下所示:

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