已知条件:MySQL数据库 
存在一张表,表名为teacher,主键为id,表中有4行数据

select * from teacher;

要求:要求使用数据库插入语句往表中插入数据,若需要插入表中的数据(或者数据的主键)如果已经在表中存在,那么要求SQL在执行的时候不能报错。

例如:插入一行id=3,name=丁老师,salary=5000的记录,

insert into teacher(id,name,salary) values(3,'丁老师',5000);

因为id=3的主键在表中已经存在,所以强行执行SQL插入的话程序会报错。

方法(1):使用 replace 代替 insert

replace into teacher(id,name,salary) values(3,'丁老师',5000);

  • 1

    在MySQL中 replace 的执行效果和 insert 的效果是一样的,不同的是replace 语句会把后来插入表中的记录替换掉已经存在于表中的记录,此法不推荐使用。 
    因为若此时再插入一条语句 
    replace into teacher(id,name,salary) values(3,'苏老师',9000); 
    那么这条语句的内容会把先前插入表中的内容id=3,name=丁老师,salary=5000的记录替换掉

    方法(2):结合select的判断式insert 语句

    灵感代码:

    insert into tableA(x,y,z) select * from tableB

    模板代码:

    insert into teacher(id,name,salary) select ?,?,? from teacher where not exists(select * from teacher where id=?) limit 1;

    或者

    insert into teacher(id,name,salary) select distinct ?,?,? from teacher where not exists(select * from teacher where id=?);

    例子:插入一行id=3,name=丁老师,salary=5000的记录

    insert into teacher(id,name,salary)

    select 3,'丁老师',5000 from teacher

    where not exists(select * from teacher where id=3) limit 1;

    或者

    insert into teacher(id,name,salary)

    ( select 4,'白老师',4000 from teacher

    where not exists(select * from teacher where id=4) limit 1);

    在上面的SQL语句中:执行的原理解析:

    若teacher表中不存在id=3的那条记录,则生成要插入表中的数据并插入表;

    若teacher表中存在id=3的那条记录,则不生成要插入表中的数据。

    其实程序可以分开看:

    ① select * from teacher where id=3 若查询有值,则表示真,即存在id=3这条记录,若查询没有值则表示假,即不存在id=3这条记录,

    ②若果不存在id=3这条记录,那么又因为 not exists 本身表示假,即不存在的意思;假假为真,所以此时程序可以形象的理解为

    select 3,'丁老师',5000 from teacher where not exists (false) limit 1;

    等价于

    select 3,'丁老师',5000 from teacher where true limit 1;

    ③所以程序就会生成一行为 3,'丁老师',5000的记录

    ④最后生成的数据就会插入表中

SQL 语句之insert语句插入数据:若表中有重复的主键或数据继续插入解决方案相关推荐

  1. mysql主键自增 insert_MySQL数据表中有自增长主键时如何插入数据

    https://jingyan.baidu.com/article/fcb5aff7b3a025edaa4a7130.html 设置自增列 phpmyadmin 把A_I选中 就是AUTO_INCRE ...

  2. mysql一个表中可以有几个主键_数据库的单个数据表中有几个主键?

    数据库的单个数据表中只能有一个主键.数据库主键,指的是一个列或多列的组合,其值能唯一地标识表中的每一行,通过它可强制表的实体完整性:主键主要是用与其他表的外键关联,以及本记录的修改与删除. 数据库的单 ...

  3. SQL Server 表中有重复的数据,无法对重复数据进行更新或删除。

    SQL Server 表中有重复的数据,无法对重复数据进行更新或删除. 弹出错误信息提示窗口提示"已更新或删除的行值要么不能使该行成为唯一行,要么改变了多个行(2行). 通常这种情况是因为表 ...

  4. 关于数据库中有自增主键时如何插入数据?

    这里以一张user表为例,id为自增的. CREATE TABLE `user` (   `id` int(11) NOT NULL AUTO_INCREMENT,   `username` varc ...

  5. mysql设置主键自增长,插入数据时报错,解决

    mysql设置主键自增长,插入数据时报错,解决 创建一个可以自增长的表 create table user ( sid int not null primary key auto_inrement, ...

  6. mysql 导入主键冲突_MySQL 处理插入过程中的主键唯一键重复值的解决方法

    本篇文章主要介绍在插入数据到表中遇到键重复避免插入重复值的处理方法,主要涉及到IGNORE,ON DUPLICATE KEY UPDATE,REPLACE:接下来就分别看看这三种方式的处理办法. IG ...

  7. mysql mybatis 主键id_MyBatis+MySQL 返回插入的主键ID

    需求:使用MyBatis往MySQL数据库中插入一条记录后,需要返回该条记录的自增主键值. 方法一 在mapper中指定keyProperty属性,示例如下: insert into user(use ...

  8. mysql mybatis 主键id_MyBatis+MySQL 返回插入的主键ID-Go语言中文社区

    需求:使用MyBatis往MySQL数据库中插入一条记录后,需要返回该条记录的自增主键值. 方法:在mapper中指定keyProperty属性,示例如下: insert into user(user ...

  9. SQL - 创建一个学生表,要求有主键约束和非空约束

    SQL - 创建一个学生表,要求有主键约束和非空约束 CREATE TABLE [dbo].[Student] ([ID] [int] NOT NULL,[Name] [nchar](10) NOT ...

最新文章

  1. Python基础实战之函数的参数讲解(三)
  2. 介绍Python中的__future__模块
  3. terminal怎么运行c语言文件,在mac电脑的terminal里该如何运行c语言
  4. 把数据存入excel文件_Python从原Excel表中抽出数据存入同一文件的新的Sheet(实例53)...
  5. 软件工程—让软件包自带commit id
  6. runltp出现问题 [
  7. 二级指针、数组指针、二维数组、指针数组作为函数形参时可传入的实参
  8. 农信银高莉:农信科技共享计划
  9. 咏南中间件+开发框架中秋国庆大促
  10. Web系统测试Web安全性测试
  11. 在英文邮件中,如何在开头对收件人进行称呼?
  12. 疯狂Android讲义(一)——第一部分
  13. HDCP @ Locality Check
  14. 计算机硬盘有坏道,硬盘有坏道就不能用了吗?别再吃哑巴亏了,今天跟大家再说一次!...
  15. matlab 数组中的一个值,MATLAB数组元素引用的三种方法
  16. ABBYY FineReader 14创建PDF文档功能解析
  17. ubuntu安装时姓名、计算机名、用户名的含义
  18. IE和FF下document.body对象的clientHeight,offsetHeight,scrollHeight的差别
  19. 【原创】MATLAB汽车制动防抱死模型ABS模型
  20. OSX 软件选择之编辑器

热门文章

  1. 【数据竞赛】CV赛题总结:人民币面值与编码识别
  2. 四个好用却可能不为人所熟知的Pandas函数,建议收藏!!!
  3. 解读:一种来自Facebook团队的大规模时间序列预测算法(附github链接)
  4. 数据可视化实战,画个新冠肺炎地图
  5. AI基础:特征工程-文本特征处理
  6. 创新正当时 -「Innovation 2021」网易应用创新开发者大赛决赛十强正式集结
  7. 无参考评估在云信的视频测试实践
  8. “Z世代”崛起,网易云信助力猫耳FM引领声音风潮
  9. 百度献礼高校开学季:AI Studio教育版上线!
  10. javascript一些基础用法