版权声明:本文为博主原创文章,未经博主允许不得转载。 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)