All rights reserved.No part of this article may be reproduced or distributed by any means,or stored in a database or retrieval system,without the prior written permission of persistenceGoing author
https://blog.csdn.net/persistencegoing/article/details/84376427
需求是数据库中表A添加一条数据(name=张三),如果表A中张三值不存在,则添加数据,如果存在就不做操作,如何保证数据库中只存在一个唯一name呢?
有三种解决方案:
一种是SQL判断,若没有该用户名就添加,如果有就不做其它操作
INSERT INTO `child` (`id`, `name`) SELECT
'10',
'Tom'
FROM
DUAL
WHERE
(
SELECT
COUNT(0)
FROM
`child` WHERE name= 'Tom'
) < 1
一种是将name设置成唯一索引(并发会报错,错误是数据库中有该name)
一种是service中判断数据库中有没有该name,若没有执行添加的操作,service中要加锁,解决高并发问题(如果是集群下要用分布式锁)
其它:
根据主键(id)或者唯一索引(user_name)来判断,如果没有则添加,如果存在,则修改或者删除后修改
比如数据库中有数据id=1,user_name=admin,数据id=2,user_name=xxxx,然后我执行下面的sql
replace into `sys_log` (
`id`,
`user_name`,
`ip`,
`type`,
`text`,
`create_time`
)
VALUES
(
'2',
'admin',
'777',
1,
'777',
'2018-12-28 19:05:51'
)
数据库中已经存在id=2,唯一索引为admin的两条数据,那么执行后的结果是删除了id=1,user_name等于admin的数据,id等于2的修改了user_name和其它,也就是说user_name是唯一索引,会删掉其它行user_name=admin的数据之后再修改id=2的行
根据id判断,如果这个id没有就添加,如果这个id存在,UPDATE 修改自定义东西(多个字段用,)
INSERT INTO `lenos`.`sys_log` (
`id`,
`user_name`,
`ip`,
`type`,
`text`,
`create_time`
)
VALUES
(
'1',
'xxxxxxxxxxxx',
'lsdxxxxxxxxxxlfs',
1,
'rrrrrrrrrrrrr',
'2018-12-28 19:05:51'
)
ON DUPLICATE KEY UPDATE type = type + VALUES(type)
希望大家关注我一波,防止以后迷路,有需要的可以加群讨论互相学习java ,学习路线探讨,经验分享与java求职 群号:721515304