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 字段值应大于零的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:验证大于零的数字失败

MySQL AUTO INCREMENT 字段值是不是总是大于 0?

mysql面试题:字段中@之前字符相同且大于等于2条的所有记录

MySQL-单表查询

sql 语句:一个字段,连续几天值大于0,获得天数 怎么解决的?请教

mysql联合索引有大于小于能用到索引吗