首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

mysql技巧:如果记录存在更新如果不存在插入的三种处理方法

要求: 新增一个员工时,如果该员工已存在(以员工号f_emp_code作为判断依据),更新,否则插入。而且工资f_salary,更新时,不得低于原工资(即:工资只能涨,不能降)。...f_salary ) VALUES( '10007' , '新人' , '西安' , IF(1000 > f_salary , 1000 , f_salary)); replace into相当于,先检测该记录是否存在...(根据表上的唯一键),如果存在,先delete,然后再insert。...这个方法有一个很大的问题,如果记录存在,每次执行完,主键自增id就变了(相当于重新insert了一条),对于有复杂关联的业务场景,如果主表的id变了,其它子表没做好同步,会死得很难看。...该方法,没有replace into的副作用,不会导致已存在记录的自增id变化。

8.8K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    leetcode-82. 删除排序链表中的重复元素 II

    next; } * } */ class Solution { public ListNode deleteDuplicates(ListNode head) { // 如果头节点返回...head); // 定义当前节点并把哑结点指向它 ListNode cur = dummy; // cur.next 与 cur.next.next 不能为才能进入循环...) { // 记录重复的值 int x = cur.next.val; // 跳过所有与记录的重复值相同的值...这道题的目的是删除重复的节点,由于链表的头节点可能会被删除,因此我们需要额外使用一个哑节点(dummy node)指向链表的头节点,定义当前节点并把哑结点指向哑节点,cur.next 与 cur.next.next 不能为才能进入循环...,若 cur.next.val == cur.next.next.val 说明重复,记录重复的值,用 while 跳过所有与记录的重复值相同的值;若不重复当前值右移,最后返回 dummy.next

    19020

    Java并发之AQS详解

    由图可知,如果曾经尾节点不为的时候,node节点会加入到队列末尾,那么如果曾经尾节点或者CAS失败调用enq(node);会怎么样呢?...node.prev = null; } 为什么要将头节点的线程置呢,是因为在 tryAcquire(arg)中就已经记录了当前获取锁的线程了,在记录就多此一举了,我们看前文中提到的...= null) { //记录下当前节点的后置节点 Node next = node.next; //如果后置节点不为...,把当前节点通过addWaiter方法包装成node节点插入队列 如果尾节点或者CAS操作失败调用enq方法保证成功插入到队列,若节点初始化头节点 3.acquireQueued方法,入队后的节点继续获取锁...cancelled,队列会从当前节点的前一个节点开始从后向前遍历跳过cacelled状态的节点,将当前节点和非cacelled状态的节点连接起来,返回false,不可以挂起 否则将前置节点等待状态设置

    33320

    12张图一次性搞懂高性能并发容器ConcurrentLinkedQueue

    tail p用于循环遍历的节点,当p节点真正尾节点时才允许添加新节点 q 用于记录p的后继节点 在入队时分三种情况: 当p的后继节点时(p真正尾节点),尝试CAS增加新节点,成功后尝试更新尾节点...q 用于记录p的后继节点 出队的情况分为四种 当p真正头节点时,CAS将数据设置,然后判断head是否真正头节点,不是更新头节点,然后将原来的头节点next指向它自己构建成哨兵节点 当p的后继节点时...,说明队列为,尝试CAS将头节点修改成p 如果p的后继节点是它自己,说明其他线程poll出队构建成哨兵节点,跳过本次循环 其他情况向后遍历 public E poll() {...//尝试CAS将数据设置null,如果数据item替换为null,失败说明其他线程以及出队,继续循环 if (item !...item没写数据,说明存储的数据如果节点next没画指向关系,也说明为】 执行构造时,会初始化首尾节点指向同一个数据的节点 在第一次入队时,一进入循环就满足第一种情况,此时的p就是真正尾节点

    19521

    Active Record 数据验证

    方法自己执行验证,如果对象上没有错误返回 true ,否则返回 false,invalid? 方法则相反。...执行验证之后,错误可以通过实例方法 errors.message 获取,这个方法返回一个错误集合,如果说明对象是有效的。需要注意的是,如果没有验证数据,这个方法返回的也是一个空集合。 ?...如果要验证某个属性是否有效,可以使用 errors[:attribute] ,这返回一个包含了所有错误的数组,如果没有错误返回空数组,这个方法和 invalid?...= :odd :必须奇数 :even :必须偶数 此方法默认不接受 nil 值,可以使用 allow_nil: true 选项允许接受 nil presence 检查属性是否值...end absence 验证属性值是否,使用 present?

    1.4K20

    python 字典的内部实现原理介绍

    若找到的表元是的,抛出KeyError 异常。若不是的,表元里会有一对 found_key:found_value。...这时候 Python 会检验 search_key == found_key 是否真,如果它们相等的话,就会返回 found_value。 ?...若这次找到的表元是的,同样抛出 KeyError;若非,或者键匹配,返回这个值;或者又发现了散列冲突,重复以上的步骤。...举例而言,如果你需要存放数量巨大的记录,那么放在由元组或是具名元组构成的列表中会是比较好的选择;最好不要根据 JSON 的风格,用由字典组成的列表来存放这些记录。...如果你在迭代一个字典的所有键的过程中同时对字典进行修改,那么这个循环很有可能会跳过一些键——甚至是跳过那些字典中已经有的键。 由此可知,不要对字典同时进行迭代和修改。

    4.3K32

    【一天一大 lee】比较含退格的字符串 (难度:简单) - Day20201019

    注意: 如果对空文本输入退格字符,文本继续。 示例: 示例 1: 输入:S = "ab#c", T = "ad#c" 输出:true 解释:S 和 T 都会变成 “ac”。...t.length - 1) } else { t = t + T[i] } } return s === t } 双指针 声明两个指针分别对 T、S 从后向前比较: 遇到#记录指针跳过次数...+1 遇到非#且跳过次数伪 0,比较两字符串指针上的字符是否相同 如果不同直接返回 false 如果比较到最后一直相同默认返回 true var backspaceCompare = function...S, T) { let sIndex = S.length - 1, // S指针 tIndex = T.length - 1, // T指针 skipS = 0, // S中需要跳过...(删除)的字符数量 skipT = 0 // T中需要跳过(删除)的字符数量 while (sIndex >= 0 || tIndex >= 0) { // S非#且跳过次数伪 0

    29120
    领券