SQL154 插入记录(一)

描述

牛客后台会记录每个用户的试卷作答记录到exam_record表,现在有两个用户的作答记录详情如下:

  • 用户1001在2021年9月1日晚上10点11分12秒开始作答试卷9001,并在50分钟后提交,得了90分;
  • 用户1002在2021年9月4日上午7点1分2秒开始作答试卷9002,并在10分钟后退出了平台。

试卷作答记录表exam_record中,表已建好,其结构如下,请用一条语句将这两条记录插入表中。

FiledTypeNullKeyExtraDefaultComment
idint(11)NOPRIauto_increment(NULL)自增ID
uidint(11)NO(NULL)用户ID
exam_idint(11)NO(NULL)试卷ID
start_timedatetimeNO(NULL)开始时间
submit_timedatetimeYES(NULL)提交时间
scoretinyint(4)YES(NULL)得分

该题最后会通过执行SELECT uid, exam_id, start_time, submit_time, score FROM exam_record;来对比结果

INSERT INTOexam_record (uid, exam_id, start_time, submit_time, score)
VALUES('1001','9001','2021-09-01 22:11:12','2021-09-01 23:01:12','90');
INSERT INTOexam_record (uid, exam_id, start_time)
VALUES('1002','9002','2021-09-04 07:01:02');

SQL INSERT INTO 语句:插入记录的不同方式

INSERT INTO 语句是 SQL 中用于向数据库表中添加新记录(行)的核心命令。根据需要插入的数据完整性、目标列的指定方式以及数据来源,有多种使用方式。

1. 完整插入 (指定所有列)
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
  • 说明: 明确指定要插入数据的所有列名(或大部分关键列),并在 VALUES 子句中提供对应顺序的值。
  • 优点: 清晰、安全、可读性强。即使表结构后续有变动(如新增列),只要新列有默认值或允许 NULL,此语句通常仍能正常执行。
  • 缺点: 需要写出所有列名,代码稍长。
  • 分析: 明确指定了 exam_record 表的 uidexam_idstart_timesubmit_timescore 这5个列,并提供了对应的值。这是一次完整的考试记录插入,包含了开始时间、提交时间和得分。
  • 示例
  • INSERT INTOexam_record (uid, exam_id, start_time, submit_time, score)
    VALUES('1001','9001','2021-09-01 22:11:12','2021-09-01 23:01:12','90');
2. 部分插入 (指定部分列)
INSERT INTO table_name (column1, column2, ...) -- 只列出需要赋值的列
VALUES (value1, value2, ...);
  • 说明: 只指定需要插入数据的部分列名。未指定的列将根据其定义被赋予默认值(如 DEFAULT 约束)、NULL(如果允许),或者如果该列是 AUTO_INCREMENT 主键,会自动生成下一个值。
  • 优点: 灵活,当某些列的值可以由数据库自动生成或可以为空时,无需手动指定。
  • 缺点: 需要清楚了解表结构和各列的约束(如 NOT NULL、默认值等),否则可能因缺少必要值而插入失败。
  • 分析: 只指定了 uidexam_idstart_time 三个列。submit_time 和 score 列未指定。
  • 结果: submit_time 很可能为 NULL(表示考试尚未提交),score 也为 NULL(或0,取决于表设计)。这通常用于记录用户开始考试的事件,最终成绩和提交时间将在考试结束后更新。
  • 示例
  • INSERT INTOexam_record (uid, exam_id, start_time)
    VALUES('1002','9002','2021-09-04 07:01:02');
3. 省略列名列表的插入 (不推荐)

语法:

INSERT INTO table_name
VALUES (value1, value2, value3, ...); -- 值的顺序必须严格匹配表的列顺序
  • 说明: 省略 () 中的列名列表。VALUES 中的值必须严格按照表定义的列顺序提供,且数量必须完全匹配。
  • 优点: 代码最短。
  • 缺点:
    • 极易出错: 一旦表结构改变(如增删列、调整列序),此语句极可能失败或插入到错误的列。
    • 可读性差: 无法直观看出每个值对应哪个列。
    • 灵活性差: 必须为所有列提供值,即使是 NULL 或默认值也需要显式写出来。
  • 结论: 强烈不推荐在生产环境或需要维护的代码中使用此方式。
4. 插入多行记录

语法:

INSERT INTO table_name (column1, column2, ...)
VALUES (value1a, value2a, ...),(value1b, value2b, ...),(value1c, value2c, ...);
  • 说明: 在一个 INSERT 语句中,通过 VALUES 后跟多组用逗号分隔的 (值) 来一次性插入多条记录。
  • 优点: 效率高,比执行多条单行 INSERT 语句更快,尤其是在处理大量数据时,减少了网络往返和事务开销。
  • 注意: 所有行的列名列表必须相同。
  • 示例:
    INSERT INTO exam_record (uid, exam_id, start_time)
    VALUES ('1003', '9001', '2021-09-05 10:00:00'),('1004', '9001', '2021-09-05 10:05:00'),('1005', '9003', '2021-09-06 14:30:00');
5. 从其他表插入数据 (INSERT INTO ... SELECT)

语法:

INSERT INTO table_name (column1, column2, ...)
SELECT column1, column2, ...
FROM source_table
WHERE condition;
  • 说明: 将一个 SELECT 查询的结果集直接插入到目标表中。
  • 优点: 强大且高效,适用于数据迁移、备份、根据条件复制数据等场景。
  • 注意: SELECT 查询返回的列数和数据类型必须与 INSERT INTO 指定的列兼容。
  • 示例 (假设要将已完成的考试记录归档):
    INSERT INTO exam_archive (uid, exam_id, start_time, submit_time, score)
    SELECT uid, exam_id, start_time, submit_time, score
    FROM exam_record
    WHERE submit_time IS NOT NULL AND score IS NOT NULL; -- 假设已提交且有成绩
6. 替换插入 (REPLACE INTO)

语法:

REPLACE INTO table_name [(column1, column2, ...)]
VALUES (value1, value2, ...);
  • 说明: 这是 MySQL 特有的扩展语句。它尝试插入新行,如果新行与现有行在主键或唯一索引上发生冲突,则先删除旧行,再插入新行
  • 核心逻辑: REPLACE INTO = DELETE (冲突行) + INSERT (新行)。
  • 优点:
    • 简化逻辑: 一行代码实现“存在则替换,不存在则插入”。
    • 原子性: 操作通常是原子的。
  • 缺点:
    • 性能开销: “删除+插入”比 UPDATE 开销大。
    • 主键变更: 自增主键会获得新值,可能影响外键引用。
    • 非标准: 仅 MySQL/MariaDB 支持,可移植性差。
  • 示例:
    REPLACE INTO examination_info VALUES(NULL, 9003, "SQL", "hard", 90, "2021-01-01 00:00:00");
    • 分析: 假设 exam_id=9003 是唯一键。
      • 若 exam_id=9003 不存在:直接插入,自增主键获新值。
      • 若 exam_id=9003 已存在:先删除旧记录,再插入新记录,自增主键会变成一个新值

总结与最佳实践

  1. 明确指定列名: 始终使用 INSERT INTO table_name (col1, col2, ...) 的形式,避免省略列名列表。这能确保代码的健壮性和可维护性。
  2. 利用部分插入: 当某些列的值可以由数据库自动处理(如 AUTO_INCREMENTDEFAULTNULL)时,使用部分插入是合理且常见的做法(如你的第二个示例)。
  3. 批量插入: 当需要插入多条记录时,优先考虑使用单条 INSERT 语句插入多行,以提高性能。
  4. 数据来源: 除了直接提供值 (VALUES),也要熟悉 INSERT ... SELECT 这种从查询结果插入数据的强大方式。
  5. 注意数据类型: 确保 VALUES 或 SELECT 中的值与目标列的数据类型兼容。你的示例中使用了单引号包裹字符串和日期时间,这是正确的做法。对于数值类型(如 score),通常不需要引号,但加上引号(如 '90')在多数数据库中也会被隐式转换,不过最好遵循数据类型规范。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/91976.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/91976.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BeanFactory 和 ApplicationContext 的区别?

口语化答案好的,面试官。BeanFactory和ApplicationContext都是用于管理Bean的容器接口。BeanFactory功能相对简单。提供了Bean的创建、获取和管理功能。默认采用延迟初始化,只有在第一次访问Bean时才会创建该Bean。因为功能较为基础,BeanFact…

VNC连接VirtualBox中的Ubuntu24.04 desktop图形化(GUI)界面

测试环境:VirtualBox 7,Ubuntu24.04 desktop,Ubuntu24.04 server(no desktop) 一、下载和安装dRealVNC viewer。 二、配置 VirtualBox 网络:NAT 模式 端口转发 1、打开 VirtualBox,选择您的 Ubuntu 虚拟机,点击 设置。 选择 网…

浮动路由和BFD配置

拓扑图 前期的拓扑图没有交换机配置步骤 1、配置IP地址 终端IP地址的配置 路由器IP地址的配置 配置router的对应接口的IP地址 <Huawei>sys [Huawei]sysname router [router]interface Ethernet 0/0/0 [router-Ethernet0/0/0]ip address 192.168.10.254 24 [router-Ethern…

Docker 实战 -- Nextcloud

文章目录前言1. 创建 docker-compose.yml2. 启动 Nextcloud3. 访问 Nextcloud4. 配置优化&#xff08;可选&#xff09;使用 PostgreSQL使用 redis添加 Cron 后台任务5. 常用命令6. 反向代理&#xff08;Nginx/Apache&#xff09;前言 当你迷茫的时候&#xff0c;请点击 Docke…

【计算机网络 | 第2篇】计算机网络概述(下)

文章目录七.因特网服务提供商&#x1f95d;八.接入网&#x1f95d;主流的家庭宽带接入方式介入网工作原理&#x1f9d0;DSL技术&#xff1a;铜线上的“三通道”通信DSL的速率标准呈现出显著的"不对称"特征&#x1f914;电缆互联网接入技术&#x1f34b;‍&#x1f7e…

SpringMVC 6+源码分析(四)DispatcherServlet实例化流程 3--(HandlerAdapter初始化)

一、概述 HandlerAdapter 是 Spring MVC 框架中的一个核心组件&#xff0c;它在 DispatcherServlet 和处理程序&#xff08;handler&#xff09;之间扮演适配器的角色。DispatcherServlet 接收到 HTTP 请求后&#xff0c;需要调用对应的 handler 来处理请求&#xff08;如控制器…

【lucene】FastVectorHighlighter案例

下面给出一套可直接拷贝运行的 Lucene 8.5.0 FastVectorHighlighter 完整示例&#xff08;JDK 8&#xff09;&#xff0c;演示从建索引、查询到高亮的全过程。 > 关键点&#xff1a;字段必须 1. 存储原始内容&#xff08;setStored(true)&#xff09; 2. 开启 TermVecto…

C++返回值优化(RVO):高效返回对象的艺术

在C开发中&#xff0c;按值返回对象的场景十分常见&#xff08;如运算符重载、工厂函数等&#xff09;&#xff0c;但开发者常因担忧“构造/析构的性能开销”而陷入纠结&#xff1a;该不该返回对象&#xff1f;如何避免额外成本&#xff1f;本文将剖析痛点、拆解错误思路&#…

用 PyTorch 实现一个简单的神经网络:从数据到预测

PyTorch 是目前最流行的深度学习框架之一&#xff0c;以其灵活性和易用性受到开发者的喜爱。本文将带你从零开始&#xff0c;用 PyTorch 实现一个简单的神经网络&#xff0c;用于解决经典的 MNIST 手写数字分类问题。我们将涵盖数据准备、模型构建、训练和预测的完整流程&#…

四级页表通俗讲解与实践(以 64 位 ARM Cortex-A 为例)

&#x1f4d6; &#x1f3a5; B 站博文精讲视频&#xff1a;点击链接&#xff0c;配合视频深度学习 四级页表通俗讲解与实践&#xff08;以 64 位 ARM Cortex-A 为例&#xff09; 本文面向希望彻底理解现代 64 位架构下四级页表的开发者&#xff0c;结合 ARM Cortex-A 系列处理…

AI模型整合包上线!一键部署ComfyUI,2.19TB模型全解析

最近体验了AIStarter平台上线的AI模型整合包&#xff0c;包含2.19TB ComfyUI大模型&#xff0c;整合市面主流模型&#xff0c;一键部署ComfyUI&#xff0c;省去重复下载烦恼&#xff01;以下是使用心得和部署步骤&#xff0c;适合AI开发者参考。工具亮点这款AI模型整合包由熊哥…

灰色优选模型及算法MATLAB代码

电子装备试验方案优选是一个典型的多属性决策问题&#xff0c;通常涉及指标复杂、信息不完整、数据量少且存在不确定性的特点。灰色系统理论&#xff08;Grey System Theory&#xff09;特别擅长处理“小样本、贫信息”的不确定性问题&#xff0c;因此非常适合用于此类方案的优…

AI框架工具FastRTC快速上手6——视频流案例之物体检测(下)

一 前言 上一篇,我们实现了用YOLO对图片上的物体进行检测,并在图片上框出具体的对象并打出标签。但只是应用在单张图片,且还没用上FastRTC。 本篇,我们希望结合FastRTC的能力,实现基于YOLO的实时视频流的物体检测。 本篇文字将不会太多。学习完本篇,对比前面的文章,你…

PHP常见中高面试题汇总

一、 PHP部分 1、PHP如何实现静态化 PHP的静态化分为&#xff1a;纯静态和伪静态。其中纯静态又分为&#xff1a;局部纯静态和全部纯静态。 PHP伪静态&#xff1a;利用Apache mod_rewrite实现URL重写的方法&#xff1b; PHP纯静态&#xff0c;就是生成HTML文件的方式&#xff0…

基于Java AI(人工智能)生成末日题材的实践

Java AI 生成《全球末日》文章的实例 使用Java结合AI技术生成《全球末日》题材的文章可以通过多种方式实现,包括调用预训练模型、使用自然语言处理库或结合生成式AI框架。以下是30个实例的生成方法和示例代码片段。 调用预训练模型(如GPT-3或GPT-4) 使用OpenAI API生成末日…

针对软件定义车载网络的动态服务导向机制

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

Pytorch实现婴儿哭声检测和识别

Pytorch实现婴儿哭声检测和识别 目录 Pytorch实现婴儿哭声检测识别 1. 项目说明 2. 数据说明 &#xff08;1&#xff09;婴儿哭声语音数据集 &#xff08;2&#xff09;自定义数据集 3. 模型训练 &#xff08;1&#xff09;项目安装 &#xff08;2&#xff09;准备Tra…

海信IP810N/海信IP811N_海思MV320-安卓9.0主板-TTL烧录包-可救砖

海信IP810N&#xff0f;海信IP811N_海思MV320处理器-安卓9主板-TTL烧录包-可救砖准备工作&#xff1a;TTL线自备跑码工具【putty跑码中文版】路径&#xff1a;【工具大全】-【putty跑码中文版】测试跑码以后将跑码窗口关闭&#xff1b;然后到下方下载烧录工具并大致看下教程烧录…

Go 中的 interface{} 与 Java 中的 Object:相似之处与本质差异

在软件系统开发中&#xff0c;“通用类型”的处理是各语言设计中不可忽视的一部分。Java 使用 Object&#xff0c;Go 使用 interface{}&#xff0c;它们都可以容纳任意类型的值&#xff0c;是实现动态行为或通用容器的基础类型。然而&#xff0c;虽然两者在使用层面看似相似&am…

Docker-07.Docker基础-数据卷挂载

一.案例首先我们通过一则案例来引出问题。我们要修改nginx容器内的html目录下的index.html文件&#xff0c;并且要将静态资源部署到nginx的html目录&#xff0c;就要首先知道该html目录的所在位置。我们首先查看nginx镜像的帮助文档&#xff0c;这里就是将有关静态资源目录的&a…