MySQL快速回顧:插入操作

来源:https://www.cnblogs.com/flunggg/archive/2020/01/13/12186390.html
-Advertisement-
Play Games

前提要述:參考書籍《MySQL必知必會》 《MySQL必知必會》是先講了查詢,但是沒有記錄就無法查詢,所以先將如何添加數據。 表已經知道怎麼創建了,隨便創兩張。 5.1 插入數據 MySQL使用 INSERT來插入(或添加)行(記錄)到資料庫表中。插入可用以下幾種方式使用: 插入完整的行(記錄); ...


前提要述:參考書籍《MySQL必知必會》

《MySQL必知必會》是先講了查詢,但是沒有記錄就無法查詢,所以先將如何添加數據。

表已經知道怎麼創建了,隨便創兩張。

5.1 插入數據

MySQL使用 INSERT來插入(或添加)行(記錄)到資料庫表中。插入可用以下幾種方式使用:

  • 插入完整的行(記錄);
  • 插入行的一部分;
  • 插入多行;
  • 插入某些查詢結果。

5.2 插入完整的行(記錄)

什麼叫完整的行,即插入的有效數據都可以對應表中的每一列。

把數據插入表中,最簡單的方法是使用基本的INSERT語法,需要指定表名和被插入到新行中的值,格式:

# 寫法:
INSERT INTO <table_name> VALUES(value1,value2,...);
# 規範寫法:
INSERT INTO <table_name>(field1, field2, ...) VALUES(value1,value2,...);

解釋:

  • 如果使用第一種寫法,雖然很簡單,但是並不安全,應該儘量避免使用。因為該語句高度依賴於表中列的次序,並且還依賴其次序容易獲得的信息。即使可得到這種次序信息,也不能保證下次表結構變動後各個列保持完全相同的次序。所以在開發中如果這樣寫,那麼就是把插入語句寫死了。因為資料庫表中的列的順序有可能可能會改變,一旦改變,就會出現致命錯誤,比如:一個varchar類型的可能會被插入到char中,如果超長度可能會報錯,而且varchar是大範圍而char是小範圍,可能會導致數據丟失;而如果一個浮點型的數據因為列順序的改變插入到了一個整型的列中,這又不會報錯,所以也很難找錯。
  • 推薦使用規範寫法,特別是在開發時編寫sql語句。因為一旦指定列名,那麼VALUES必須以其指定的次序匹配指定的列名,不一定按各個列出現在實際表中的次序。 所以即使表的結構改變,此INSERT語句仍然可以正確工作。
  • 第一種寫法必須完整的給出表中的全部列的值,並且還得按照表中列的次序;而規範寫法不用,因為會根據(field1, field2, ...)來進行賦值,即使跟表中的列的次序不一樣,或者一些列不想賦值。

例子:在學生表中插入數據

INSERT INTO student(stu_id, stu_name, stu_sex)  VALUES(1, '張三', '男');

註意:字元串或字元需要使用''(單引號)圈起來。

輸出:如果成功的話

Query OK, 1 row affected (0.01 sec)

而如果在主鍵使用了自增長(AUTO_INCREMENT),那麼則可以這樣寫

INSERT INTO student(stu_id, stu_name, stu_sex)  VALUES(null, '張三', '男');

或者,不寫主鍵:

INSERT INTO student(stu_name, stu_sex)  VALUES('張三', '男');

也就是插入時,在主鍵的位置直接插入null或者不寫預設就是賦給null,MySQL會因為AUTO_INCREMENT自己給它賦值。


  • 如果對錶中不允許NULL值且沒有預設值的列不給出值(插入時省略了),則MySQL將產生一條錯誤信息,並且相應的行插入不成功。
  • 規範寫法哪些列可以省略不寫:
    • 該列定義為允許NULL值(無值或空值);
    • 在表定義中給出預設值。也就表示如果在插入時不給出值,就會使用預設值;
    • 使用AUTO_INCREMENT的列。
  • INSERT操作可能很耗時(特別是有很多索引需要更新時),而且它可能降低等待處理的SELECT語句的性能。如果數據檢索是最重要的,則可以通過在INSERT和INTO之間添加關鍵字LOW_PRIORITY,指示MySQL降低INSERT語句的優先順序。
INSERT LOW_PRIORITY INTO
  • UPDATE操作和DELETE操作也適用。

5.3 插入多個行

INSERT可以插入一行到一個表中,也可以插入多行到一個表中,第一種方式就是寫多條INSERT語句,還有一種方式就是在一條INSERT語句中插入多行。

語法:

INSERT INTO <table_name>(
    field1,
    field2,
    ...
    )
    VALUES(
        valueA1,
        valueA2,
        ...
        ),
        (
        valueB1,
        valueB2,
        ...
    );

此寫法可以提供INSERT的性能,因為MySQL用單條INSERT語句處理多個插入比使用多條INSERT快。

5.4 插入檢索出的數據

INSERT語句可以利用一條SELECT語句查詢的結果插入到表中。也就是所謂的INSERT SELECT,它是由一條INSERT語句和一條SELECT語句構成。

比如我需要把一張表的數據複製到另一張表,語法:

INSERT INTO <new_table_name>(field1, field2, ...) 
    SELECT field1, field2 FROM <old_table_name>;
# 或 也就是列名可以不同
INSERT INTO <new_table_name>(field1, field2, ...) 
    SELECT f1, f2 FROM <old_table_name>;

註意:如果新表不存在則報錯。
解釋:

  • 先使用SELECT語句從舊表中查詢出數據,然後再使用INSERT語句把查詢的結果插入到新表中。
  • SELECT列出的每一個列對應於後所跟的列表中的每一個列。
  • 如果為空,即沒有行可以插入也不會報錯。
  • 如果能保證從舊表導入到新表(假設新表有數據)的主鍵值不會重覆,那麼插入時可以省略這主鍵,比如有AUTO_INCREMENT的主鍵就可以省略。
  • 在INSERT和SELECT語句中使用相同的列名,但是不一定要求列名匹配。實際上,MySQL甚至不關心SELECT返回的列名。它使用的是列的位置,因此SELECT中的第一列(不管列名)將用來填充表列中指定的第一個列,第二列將用來填充表列中指定的第二列等。
  • INSERT SELECT中SELECT語句可包含WHERE子句以過濾插入的數據。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • JVM性能優化原則: 代碼運算性能、記憶體回收、應用配置(影響Java程式主要原因是垃圾回收機制) 代碼層優化: 避免過多迴圈嵌套、調用和複雜邏輯。 Tomcat調優主要內容 1、增加最大連接數 2、調整工作模式 3、啟用gzip壓縮 4、調整JVM記憶體大小 5、作為web伺服器時、無Apache整合 ...
  • 選擇在Linux下安裝redis,現在採用虛擬機安裝的centos7 進行安裝的 1.安裝gcc redis是c語言編寫的 yum -y install gcc 2.下載redis安裝包,在root目錄下執行 wget http://download.redis.io/releases/redis- ...
  • 在Oracle資料庫中,我們使用session相關視圖(v$session、v$active_session_history,dba_hist_active_session_history等)查找問題時,往往可以定位到相應的主機名,但是,想要更進一步查找IP地址時,卻發現各個數據字典表裡面都沒有記錄... ...
  • 記錄一次 mysql 5.7 下,出現重啟資料庫後不能載入特定表的問題處理。 搜索了很多的類似的錯誤,大多都是說因為外鍵同名的索引丟失的情況。但在5.7這個版本下,會禁止更新外鍵關聯的索引。 最後經過分析,發現是之前更新了主外鍵的字元集導致的。資料庫的預設字元集是utf8mb4(預期是uft8),如 ...
  • mac 安裝 navicat for mysql 直接安裝 首先打開mac控制台輸入命令行:sudo spctl --master-disable 百度盤,提取碼: vrtr 失效請留言,會及時更新,謝謝 ...
  • MySQL 創建資料庫: CREATE DATABASE [IF NOT EXISTS] <資料庫名> [[DEFAULT] CHARACTER SET <字元集名>] [[DEFAULT] COLLATE <校對規則名>]; 註: [IF NOT EXISTS] 方法判斷資料庫是否存在,不存在才創 ...
  • php操作資料庫八步走 <?php // 1、建立連接 $connection = mysqli_connect('127.0.0.1', 'root', '123456'); // 2、判斷連接是否成功 if (mysqli_connect_error() != null) { die(mysql ...
  • 前提要述:參考書籍《MySQL必知必會》 利用空閑時間快速回顧一些資料庫基礎。 4.1 連接 在最初安裝MySQL,可能會要求你輸入一個管理登錄(通常為root)和一個口令(密碼)。 連接MySQL需要以下信息: 主機名(電腦名)——如果連接到本地MySQL伺服器,為localhost; 埠(如 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...