Home
Linux
Golang
MySQL
PHP
Other
Message
mysql忽略主键冲突、避免重复插入的几种方式
创建日期:2019-09-02 15:45:25
更新日期:2020-10-21 22:35:02
栏目:
MySQL
浏览:818
## 小二,上图  ## 方案一:使用 ignore 关键字 如果是用主键primary或者唯一索引unique区分了记录的唯一性,避免重复插入记录可以使用: `insert ignore into table_name(email,phone,user_id) values('test9@163.com','99999','9999')` 这样当有重复记录就会忽略,执行后返回数字0(更新的条数),还有个应用就是复制表,避免重复记录: `insert ignore into table(name) select name from table2` ## 方案二:使用 replace into replace的语法格式为: 1. replace into table_name(col_name, ...) values(...) 2. replace into table_name(col_name, ...) select ... 3. replace into table_name set col_name=value, ... 算法说明: REPLACE的运行与INSERT很相像,但是如果旧记录与新记录有相同的值,则在新记录被插入之前,旧记录被删除,即: 1.尝试把新行插入到表中 2.当因为对于主键或唯一关键字出现重复关键字错误而造成插入失败时: 从表中删除含有重复关键字值的冲突行 再次尝试把新行插入到表中 旧记录与新记录有相同的值的判断标准就是:表有一个PRIMARY KEY或UNIQUE索引,否则,使用一个REPLACE语句没有意义。该语句会与INSERT相同,因为没有索引被用于确定是否新行复制了其它的行。 返回值: REPLACE语句会返回一个数,来指示受影响的行的数目。该数是被删除和被插入的行数的和。受影响的行数可以容易地确定是否REPLACE只添加了一行,或者是否REPLACE也替换了其它行:检查该数是否为1(添加)或更大(替换)。 示例: eg:(phone字段为唯一索引) replace into table_name(email,phone,user_id) values('test569','99999','123') 另外:在 SQL Server 中可以这样处理: ``` if not exists (select phone from t where phone= '1') insert into t(phone, update_time) values('1', getdate()) else update t set update_time = getdate() where phone= '1' ```
内容版权声明:本文为舒孝元原创文章,转载无需和我联系,但请注明来自
舒孝元博客:https://www.shuxiaoyuan.com/info/5
联系邮箱:sxy@shuxiaoyuan.com