MySQL的SQL語句 - 數據操作語句(7)- INSERT SELECT 語句

2021-02-14 資料庫雜貨鋪
INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]    [INTO] tbl_name    [PARTITION (partition_name [, partition_name] ...)]    [(col_name [, col_name] ...)]    {SELECT ... | TABLE table_name}    [ON DUPLICATE KEY UPDATE assignment_list]
value: {expr | DEFAULT}
assignment: col_name = value
assignment_list: assignment [, assignment] ...

使用 INSERT ... SELECT 語句,可以從 SELECT 語句的結果中快速地將許多行插入到表中,該語句可以從一個或多個表中進行選擇。例如:
INSERT INTO tbl_temp2 (fld_id)  SELECT tbl_temp1.fld_order_id  FROM tbl_temp1 WHERE tbl_temp1.fld_order_id > 100;

從 MySQL 8.0.19 開始,可以用 TABLE 語句代替 SELECT,如下所示:TABLE tb 相當於 SELECT * FROM tb。當將源表中的所有列插入到目標表中,並且不需要使用 WHERE 進行篩選時,它非常有用。此外,可以使用 ORDER BY 按一個或多個列對表中的行進行排序,並且可以使用 LIMIT 子句限制插入的行數。以下條件適用於 INSERT ... SELECT 語句,除非另有說明,否則也適用於 INSERT ... TABLE:● 指定 IGNORE 以忽略可能導致重複鍵衝突的行。● INSERT 語句的目標表可以出現在查詢的 SELECT 部分的 FROM 子句中,也可以是 TABLE 指定的表。但是,不能在子查詢中插入一個表並從同一表中進行選擇。當從同一個表中進行選擇和插入時,MySQL 會創建一個內部臨時表來保存 SELECT 中的行,然後將這些行插入到目標表中。但是,當t是臨時表時,不能使用 INSERT INTO t ... SELECT ... FROM t 語句。因為在同一語句中不能引用兩次臨時表。出於同樣的原因,當t是臨時表時,不能使用 INSERT INTO t ... TABLE t 語句。● 為了確保二進位日誌可以用來重新創建原始表,MySQL 不允許 INSERT ... SELECT 或 INSERT ... TABLE 語句並發插入。● 為避免 SELECT 和 INSERT 引用同一個表時出現不明確的列引用問題,請為 SELECT 部分中使用的每個表提供一個唯一的別名,並使用適當的別名限定該部分中的列名。通過表名及後面的 PARTITION 選項可以顯式地選擇使用源表或目標表(或兩者)的哪些分區或子分區(或兩者)。在語句的 SELECT 部分 PARTITION 與源表的名稱一起使用時,只從其分區列表中指定的分區或子分區中選擇行。當 PARTITION 與目標表的名稱一起用於語句的 INSERT 部分時,必須能夠將所選的所有行插入到選項後面的分區列表中指定的分區或子分區中。否則 INSERT ... SELECT 語句失敗。不帶 ORDER BY 子句的 SELECT 或 TABLE 語句返回行的順序是不確定的。這意味著,在使用複製時,不能保證這樣的 SELECT 在主伺服器和從伺服器上以相同的順序返回行,這可能會導致它們之間的不一致。要防止這種情況發生,請確保用於複製的 INSERT ... SELECT 或 INSERT ... TABLE 語句要使用 ORDER BY 子句在主伺服器和從伺服器上能生成相同的行順序。由於這個問題,對於基於語句的複製,INSERT ... SELECT ON DUPLICATE KEY UPDATE 和 INSERT IGNORE ... SELECT 語句被標記為不安全。當使用基於語句的模式時,此類語句在錯誤日誌中生成警告,在使用 MIXED 模式時,這些語句將使用基於行的格式寫入二進位日誌。https://dev.mysql.com/doc/refman/8.0/en/insert-select.html

相關焦點

  • MySQL資料庫Insert語句7種寫法
    簡介很多開發人員工作了幾年之後,都會自嘲,自己啥技術都沒學到,就會CRUD,可是我要說的是,CRUD你真的都會嗎,你在MySQL資料庫中,會幾種insert語句寫法呢。在這裡我會7種寫法,下面我就來給大家分別介紹一下。
  • 因用了Insert into select語句,美女同事被開除了!
    通過在Baidu的海洋裡遨遊,她發現了可以使用insert into select實現,這樣就可以避免使用網絡I/O,直接使用SQL依靠資料庫I/O完成,這樣簡直不要太棒了。然後她就被開除了。事故發生的經過。由於數據資料庫中order_today數據量過大,當時好像有700W了並且每天在以30W的速度增加。
  • 為什麼要避免使用「CREATE TABLE AS SELECT」語句
    ([More information about the metadata locking in general](https://dev.mysql.com/doc/refman/5.7/en/metadata-locking.html)).
  • MySQL的insert into select 引發鎖表
    在執行語句的時候,MySQL是逐行加鎖的(掃描一個鎖一個),直至鎖住所有符合條件的數據,執行完畢才釋放鎖。 into t2(c,d) select c,d from t;先不commit;這個語句對表 t 主鍵索引加了 (-∞,1] 這個 next-key lock新開一個Navicat窗口,模擬新事務進入,此時執行下面這句sql就需要等待insert into t values(-1,-1,-1);
  • 使用Insert into select語句時需要注意的事項
    這天xxx接到一個需求,需要將表A的數據遷移到表B中去做一個備份。本想通過程序先查詢查出來然後批量插入。但xxx覺得這樣有點慢,需要耗費大量的網絡I/O,決定採取別的方法進行實現。通過在Baidu的海洋裡遨遊,他發現了可以使用insert into select實現,這樣就可以避免使用網絡I/O,直接使用SQL依靠資料庫I/O完成,這樣簡直不要太棒了。然後他就被開除了。事故發生的經過。
  • mysql常用sql語句總結
    sql語言簡潔只有7個動詞:SELECT , DROP, ALTER, CREATE, INSERT, UPDATE ,DELETE;
  • 學習MySQL的select語句
    select語句可 以用回車分隔$sql="select * from article where id=1"和  $sql="select * from article where id=1">都可以得到正確的結果,但有時分開寫或許能 更明了一點,特別是當sql語句比較長時。
  • MySQL如何完成一次查詢?
    MySQL相信大家都不陌生,是一種關係型資料庫,通過sql語言操作數據的增刪改查。那麼從發出一條sql指令到返回結果mysql都做了什麼事情呢?
  • MySQL實戰中,Insert語句的使用心得總結
    將100000條數據的插入速度提升到1-2分鐘左右↓2-1-2、修改SQL語句批量插入insert into user_info (user_id,username,password,price,hobby) values (null,'提莫隊長1','123456',3150,'種蘑菇'),(null,'蓋倫','123456',450,'踩蘑菇');
  • MySQL實戰中的Insert語句的使用心得
    將100000條數據的插入速度提升到1-2分鐘左右 ↓2、修改SQL語句批量插入:insert into user_info (user_id,username,password,price,hobby)    values (null,'提莫隊長1','123456',3150
  • php mysql SQL注入語句構造
    由於PHP和MYSQL本身得原因,PHP+MYSQL的注射要比asp困難,尤其是注射時語句的構造方面更是個難點,本文主要是借對Okphp BBS v1.3一些文件得簡單分析,來談談php+mysql注射語句構造方式,希望本文對你有點幫助。
  • MySQL的SQL語句 - 數據操作語句(15)- UPDATE 語句
    ● 使用 LOW_PRIORITY 修飾符,UPDATE 的執行將被延遲,直到沒有其他客戶端從表中讀取數據。這隻影響只使用表級鎖定的存儲引擎(如 MyISAM、MEMORY 和 MERGE)。● 使用 IGNORE 修飾符,即使在更新過程中發生錯誤,更新語句也不會中止。不會更新在唯一鍵值上引發重複鍵衝突的行。可能導致數據轉換錯誤的值的行將更新為最接近的有效值。
  • SQL學習筆記(四)----表數據操作的SQL語句
    ★主要學習表數據的操作:查詢、添加、修改、刪除數據」表數據操作的SQL語句1. 查詢數據---1.查詢指定列select 列1,列2,... from 表名;例:select id, name from students;insert into students values(0,"張三",18,default
  • Mysql中一條SQL查詢語句是如何執行的?
    2.查詢流程解析select * from table1 where ID=10;這條語句相信大家再熟悉不過了,下面我們就看看這一條語句在mysql中是怎麼執行的。第一步:一條sql語句要經過連接器,客戶端要和mysql建立連接。
  • MySQL-SQL語句執行流程
    ,或者正在生成結果集,或是在返回數據,有多種情況查詢緩存查連接建立完成後,你就可以執行 select 語句了。分析器首先通過mysql關鍵字將語句解析,會生成一個內部解析樹,mysql解析器將對其解析,查看是否是有錯誤的關鍵字,關鍵字順序是佛正確;預處理器則是根據mysql的規則進行進一步的檢查,檢查mysql語句是否合法,如,庫表是否存在,欄位是否存在,欄位之間是否模稜兩可等等,預處理器也會驗證權限。
  • 一道簡單的sql語句題
    結果才發現,數據分析崗位大多注重的是資料庫的能力,比如sql語句的考察,hive的考察,以及一些運營思維的考察,所以第一次面試就很悲劇啦,不過題目還是很有代表性的。其他的不寫了,這裡只分享一個關於sql的題目。1、問題引出現在有兩個數據表,一個數據表記錄司機的信息,比如司機id,司機姓名,司機註冊時間等等,一個數據表記錄一天的訂單情況,比如訂單ID,訂單司機id,訂單時間。
  • 資料庫常用的sql語句匯總(2)
    語句表相關創建表 create table t1(id int,name varchar(10));查看所有表 show tables;查看單個表屬性 show create table t1語句數據相關插入數據 insert into t1 values(5,'xiaoming',null); insert into t1 (id,name) values (2,'aa'); insert into t1 values(5,'xiaoming',null),(5,'xiaoming
  • SQL系列:當INSERT遇到SELECT...
    作為開發,在實際工作中經常會和資料庫打交道,會用高效快捷的sql語句如有神助般,提高工作效率。
  • Mysql常用SQL語句集錦 &建議轉發收藏
    複製代碼//替換某欄位的內容的語句$sql = "update table_name set content = REPLACE(content, 'aaa', 'bbb') ";$sql .= " where (content like '%aaa%')";複製代碼//獲取表中某欄位包含某字符串的數據$sql = "SELECT * FROM `表名` WHERE LOCATE('關鍵字', 欄位名
  • mysql批量語句,怎麼保證操作都成功?
    在一個批量操作的sql中,如果一個失敗,其他的會怎麼樣呢第一種情況:先看一下,多條語句沒有事務控制的代碼$conn = Yii::$app->db1; $sql1 = 'insert into member (name,password) values ("yang","vincent")';$sql2 = 'insert into