sql里面插入语句insert后面的values关键字可省略
插入到表名(列值)后跟一个查询语句的话就代表值,简单的说就是后面select select出来的值就是要插入的值,即
insert into tb(字段名一,字段名二)select 字段名一,字段名二 from tb
等于
insert into tb(字段名一,字段名二)values(查出的字段值一,查出来的字段值一);
插入到表名(列值)后跟一个查询语句的话就代表值,简单的说就是后面select select出来的值就是要插入的值,即
insert into tb(字段名一,字段名二)select 字段名一,字段名二 from tb
等于
insert into tb(字段名一,字段名二)values(查出的字段值一,查出来的字段值一);
或
插入到表名(列值)后跟一个查询语句的话就代表值,简单的说就是后面select select出来的值就是要插入的值,即
insert into tb(字段名一,字段名二)select 字段名一,字段名二 from tb
等于
insert into tb(字段名一,字段名二)values(查出的字段值一,查出来的字段值一);
在上面的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的记录 ④最后生成的数据就会插入表中
CREATE TABLE tb ( a int, b int ); -- 一次插入一行数据的写法: 必须要有 VALUES INSERT INTO tb VALUES(1, 2); INSERT INTO tb VALUES(1, 3); GO -- 一次插入一行或者多行数据的写法: 必须要有 SELECT INSERT INTO tb SELECT 2, 1; INSERT INTO tb SELECT 3, 1 UNION ALL SELECT 3, 2 UNION ALL SELECT 3, 3; GO -- 核对数据 SELECT * FROM tb GO a b ----------- ----------- 1 2 1 3 2 1 3 1 3 2 3 3 (6 行受影响)
批量判重插入
<sql id="Base_Column_List1" > uuid, systemName, enviromentType, jobOrderNum, jobName, executeTime, jobLogAddress, status </sql> <insert id="insertDatas" parameterType="cn.lz.devops.model.DataCollectionJobInfo" > insert into data_collection_job_info <trim prefix="(" suffix=")" suffixOverrides="," > <include refid="Base_Column_List1" /> </trim> <foreach collection="list" item="item" separator="UNION ALL" close=";"> <trim prefix="(" suffix=")" suffixOverrides="UNION ALL" > select <trim suffixOverrides="," > #{item.uuid,jdbcType=VARCHAR}, #{item.systemName,jdbcType=VARCHAR}, #{item.enviromentType,jdbcType=VARCHAR}, #{item.jobOrderNum,jdbcType=INTEGER}, #{item.jobName,jdbcType=VARCHAR}, #{item.executeTime,jdbcType=VARCHAR}, #{item.jobLogAddress,jdbcType=VARCHAR}, #{item.status,jdbcType=INTEGER} </trim> from data_collection_job_info where not exists(select * from data_collection_job_info where uuid=#{item.uuid, jdbcType=VARCHAR}) limit 1 </trim> </foreach> </insert>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理