【问题标题】:mysql field value should be greater than zeromysql 字段值应大于零
【发布时间】: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;

【问题讨论】:

标签: mysql sql


【解决方案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

    【讨论】:

      猜你喜欢
      • 2011-08-11
      • 2016-08-08
      • 1970-01-01
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-06
      相关资源
      最近更新 更多