ignore和DUPLICATE结合使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yyoc97/article/details/80847915

mysql插入存在则修改

首先我们先定义一个表结构:

CREATE TABLE `sales` (
    `sales_id` int NOT NULL AUTO_INCREMENT COMMENT '主键id',
    `store_code` varchar(20) NOT NULL COMMENT '门店编码',
    `_year` int NOT NULL COMMENT '销售年份',
    `sales_amount` decimal(10,2) NOT NULL COMMENT '销售金额',
    `target_amount` decimal(10,2) NOT NULL COMMENT '目标金额',
    `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    PRIMARY KEY (`sales_id`),
    UNIQUE `uidx_sales` (`store_code`, `_year`) comment '唯一键'
) COMMENT='年度销售表';

将门店编码和年份设置为唯一键(unique key),主键id 自增长,创建时间默认为当前时间,所以字段理论都不为null。

  • ignore

    ignore的使用和unique key相关,如果表没有设置unique key,这默认是主键primary。(ps:主键都没有用这个也没有意义)插入时如果唯一键存在于表里,也就是重复时则忽略。列如存在 store_code='TD2205' ,_year='2017' 时,执行这条语句时会被忽略。

INSERT IGNORE INTO `table_name` (`store_code`, `_year`, `sales_amount`,`target_amount`) 
VALUES ('TD2205', '2017', '3285020','10000000');
  • ON DUPLICATE KEY UPDATE
    语义上也很好理解,在重复时修改。如果存在 store_code='TD2205' ,_year='2017' 则会修改销售金额和目标金额。
INSERT INTO `table_name` (`store_code`, `_year`, `sales_amount`,`target_amount`) 
VALUES ('TD2205', '2017', '5000000','20000000');
on DUPLICATE KEY UPDATE 
    sales_amount = values(sales_amount)
    target_amount = values(target_amount)
  • ignore & DUPLICATE

    本文的重点也就是讲述他们合并时的用法。当我们直接insert into插入数据的时候,数据库是会根据表定义检测这条数据的完整性的,前面我们设置所有属性不能为空,但是主键可以自增长,创建时间也有默认取值。那么其他4个属性store_code, _year, sales_amount,target_amount 就是必须要赋值的,否则插入就将报错。比如:

INSERT INTO `table_name` (`store_code`, `_year`, `sales_amount`) 
VALUES ('TD2205', '2017', '5000000')
on DUPLICATE KEY UPDATE 
    sales_amount = values(sales_amount)

我们只想修改实际销售,不修改目标金额。但是数据库会提示你缺少 target_amount,这时怎么处理更好了? ignore 又派上用场了,之前只说了ignore会忽略唯一键重复的数据,这里补充它的另一个功能,它也可以忽略掉那些不能为null的字段。所以类似需求我们只需要添加一个ignore 就能单独修改某些字段,而忽略那些必须添加的。

INSERT ignore INTO `table_name` (`store_code`, `_year`, `sales_amount`) 
VALUES ('TD2205', '2017', '5000000')
on DUPLICATE KEY UPDATE 
    sales_amount = values(sales_amount)

猜你喜欢

转载自blog.csdn.net/yyoc97/article/details/80847915