mysql 字段值应大于零
Posted
技术标签:
【中文标题】mysql 字段值应大于零【英文标题】:mysql field value should be greater than zero 【发布时间】:2020-06-16 20:29:59 【问题描述】:下面是我的表结构,我想验证price_list_rate
字段,值应该大于零,我试过无符号
Version information: 4.5.4.1deb2ubuntu2.1
CREATE TABLE `price_list` (
`price_list_id` int(11) NOT NULL,
`price_list_city_id` int(11) NOT NULL,
`price_list_process_id` int(11) NOT NULL,
`price_list_product_id` int(11) NOT NULL,
`price_list_rate` float UNSIGNED NOT NULL,
`price_list_vendor_rate` int(11) NOT NULL,
`created_by` int(10) UNSIGNED NOT NULL,
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_by` int(10) UNSIGNED NOT NULL,
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
【问题讨论】:
值得指出的是,对于价格列,float 不是合适的数据类型。十进制会更好。 哪个 mysql 版本? ***.com/questions/2115497/… 【参考方案1】:你需要check
约束:
ALTER TABLE `price_list`
ADD CONSTRAINT chk_price CHECK (`price_list_rate` > 0);
注意:CHECK 约束从 MySQL 8.0.16
开始可用,对于旧版本,您需要防止插入 0
价格的触发器。
【讨论】:
表已经创建,如何应用查询添加CHECK
@MacRathod ALTER TABLE CHANGE COLUMN
.
@MacRathod read this
如果 MySQL 8.0.16 或更高版本。
此解决方案添加表约束,而不是字段约束。虽然它也解决了问题。【参考方案2】:
MySQL 8.0.16 实现了 SQL CHECK 约束。用这个就可以解决这个问题
ALTER TABLE `price_list`
ADD CONSTRAINT min_price CHECK (`price_list_rate` > 0);
对于早期版本,您可以通过视图 WITH CHECK OPTION 或触发器来使用 CHECK 约束。
【讨论】:
【参考方案3】:如果您的版本不支持CHECK
约束,请使用
CREATE TRIGGER tr_bi_check_price_list_rate
BEFORE INSERT
ON price_list
FOR EACH ROW
BEGIN
IF NEW.price_list_rate <= 0 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Error: `price_list`.`price_list_rate` must be positive.';
END IF;
END
和BEFORE UPDATE
事件的相同触发器。
fiddle
【讨论】:
以上是关于mysql 字段值应大于零的主要内容,如果未能解决你的问题,请参考以下文章
MySQL AUTO INCREMENT 字段值是不是总是大于 0?
mysql面试题:字段中@之前字符相同且大于等于2条的所有记录