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?表的?uid,?exam_id,?start_time,?submit_time,?score?這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、默認值等),否則可能因缺少必要值而插入失敗。
  • 分析:?只指定了?uid,?exam_id,?start_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
英文地址,請注明出處:http://en.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…