1. 程式人生 > >mysql中SELECT INTO 和 INSERT INTO SELECT 兩種表複製語句

mysql中SELECT INTO 和 INSERT INTO SELECT 兩種表複製語句

1.INSERT INTO SELECT語句

      語句形式為:Insert into Table2(field1,field2,...) select value1,value2,... from Table1

      要求目標表Table2必須存在,由於目標表Table2已經存在,所以我們除了插入源表Table1的欄位外,

      還可以插入常量

2.SELECT INTO FROM語句

      語句形式為:SELECT vale1, value2 into Table2 from Table1

      要求目標表Table2不存在,因為在插入時會自動建立表Table2,

       並將Table1中指定欄位資料複製到Table2中

如何在mysql從多個表中組合欄位然後插入到一個新表中,通過一條sql語句實現。具體情形是:有三張表abc,現在需要從表b和表c中分別查幾個欄位的值插入到表a中對應的欄位。對於這種情況,我們可以使用如下的語句來實現:

1.             INSERT INTO db1_name(field1,field2) SELECT field1,field2 FROM db2_name

當然,上面的語句比較適合兩個表的資料互插,如果多個表就不適應了。對於多個表,我們可以先將需要查詢的欄位join起來,然後組成一個檢視後再select from

就可以了:

1.             INSERT INTO a(field1,field2) SELECT * FROM(SELECT f1,f2 FROM b JOIN c) AS tb

其中f1是表b的欄位,f2是表c的欄位,通過join查詢就將分別來自表b和表c的欄位進行了組合,然後再通過select巢狀查詢插入到表a中,這樣就滿足了我們這個場景了,如果需要不止2個表,那麼可以多個join的形式來組合欄位。需要注意的是巢狀查詢部分最後一定要有設定表別名,如下:

1.             SELECT * FROM(SELECT f1,f2 FROM b JOIN c) AS tb

即最後的as tb是必須的(當然tb這個名稱可以隨意取),即指定一個別名,否則在mysql中會報如下錯誤:

​
​
​
​
​
​
​如果列清單和VALUES清單均為空清單,則INSERT會建立一個行,每個列都被設定為預設值:
 INSERT INTO tbl_name () VALUES();
假設worker表只有name和email,插入一條資料
insert into worker values(“tom”,”[email protected]”);
批量插入多條資料
insert into worker values(‘tom’,’[email protected]’),(‘paul’,’[email protected]’);
給出要賦值的那個列,然後再列出值的插入資料
insert into worker (name) values (‘tom’);
insert into worker (name) values (‘tom’), (‘paul’);
使用set插入資料
insert into worker set name=’tom’;

在 SET 子句中未命名的行都賦予一個預設值,使用這種形式的 INSERT 語句不能插入多行。

1、複製表結構以及資料

CREATE TABLE 新表  

SELECT * FROM 舊錶

2、只複製表結構

      a、      CREATE TABLE 新表

                 SELECT * FROM 舊錶 WHERE 1=2

                 即:讓WHERE條件不成立.
      b、:(低版本的mysql不支援,mysql4.0.25 不支援,mysql5已經支援了)
                CREATE TABLE 新表
                LIKE 舊錶

3、複製舊錶資料到新表(兩表結構一樣)

    INSERT INTO 新表

    SELECT * FROM 舊錶

4、複製舊錶資料到新表(兩表結構不一樣)

     INSERT INTO 新表(欄位1,欄位2,…….)
     SELECT 欄位1,欄位2,…… FROM 舊錶

一個expression可以引用在一個值表先前設定的任何列,例如

INSERT INTO tbl_name (col1,col2) VALUES(15,col1*2);
--但不能這樣
INSERT INTO tbl_name (col1,col2) VALUES(col2*2,15);

使用INSERT…SELECT語句插入從其他表選擇的行

insert into tbl_name1(col1,col2) select col3,col4 from tbl_name2;
--如果每一列都有資料

​insert into tbl_name1 select col3,col4 from tbl_name2;

查詢不能包含一個ORDER BY子句,而且INSERT語句的目的表不能出現在SELECT查詢部分的FROM子句.

ON DUPLICATE KEY UPDATE

如果您指定了ON DUPLICATE KEY UPDATE,並且插入行後會導致在一個UNIQUE索引或PRIMARY KEY中出現重複值,則執行舊行UPDATE

--假設a,b為唯一索引,表table沒有1,2這樣的行是正常插入資料,衝突時,更新c列的值INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=3;--或者是INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=values(c);--引用其他列更新衝突的行INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);

向一個已定義為NOT NULL的列中插入NULL。對於一個多行INSERT語句或INSERT INTO...SELECT語句,根據列資料的型別,列被設定為隱含的預設值。對於數字型別,預設值為0;對於字串型別,預設值為空字串('');對於日期和時間型別,預設值為“zero”值。

INSERT INTO...SELECT的ON DUPLICATE KEY UPDATE

insert into tbl_name1(a,b,c) 
  select col1,col2,col3 from tbl_name2 
ON DUPLICATE KEY UPDATE c=values(c);

INSERT DELAYED

如果您的客戶端不能等待INSERT完成,則這個選項是非常有用的,當一個客戶端使用INSERT DELAYED時,會立刻從伺服器處得到一個確定。並且行被排入佇列,當表沒有被其它執行緒使用時,此行被插入。

使用INSERT DELAYED的另一個重要的好處是,來自許多客戶端的插入被集中在一起,並被編寫入一個塊。這比執行許多獨立的插入要快很多。

INSERT DELAYED INTO worker (name) values (‘tom’), (‘paul’);

使用DELAYED時有一些限制:

  • INSERT DELAYED僅適用於MyISAM, MEMORY和ARCHIVE表。對於MyISAM表,如果在資料檔案的中間沒有空閒的塊,則支援同時採用SELECT和INSERT語句。在這些情況下,基本不需要對MyISAM使用INSERT DELAYED。

  • INSERT DELAYED應該僅用於指定值清單的INSERT語句。伺服器忽略用於INSERT DELAYED...SELECT語句的DELAYED和INSERT DELAYED...ON DUPLICATE UPDATE語句的DELAYED

  • 因為在行被插入前,語句立刻返回,所以您不能使用LAST_INSERT_ID()來獲取AUTO_INCREMENT值。AUTO_INCREMENT值可能由語句生成。

  • 對於SELECT語句,DELAYED行不可見,直到這些行確實被插入了為止。

  • DELAYED在從屬複製伺服器中被忽略了,因為DELAYED不會在從屬伺服器中產生與主伺服器不一樣的資料。

相關推薦

mysqlSELECT INTO INSERT INTO SELECT 複製語句

1.INSERT INTO SELECT語句       語句形式為:Insert into Table2(field1,field2,...) select value1,value2,... from Table1       要求目標表Table2必須存在,由於

SELECT INTO INSERT INTO SELECT 複製語句詳解(SQL資料庫Oracle資料庫的區別)

https://www.cnblogs.com/mq0036/p/4155136.html 我們經常會遇到需要表複製的情況,如將一個table1的資料的部分欄位複製到table2中,或者將整個table1複製到table2中,這時候我們就要使用SELECT INTO 和 INSER

SELECT INTO INSERT INTO SELECT 複製語句詳解

1.INSERT INTO SELECT語句 語句形式為:Insert into Table2(field1,field2,...) select value1,value2,... from Table1 或者:Insert into Table2 select  *  from T

SELECT INTO INSERT INTO SELECT 複製語句

Insert是T-sql中常用語句,Insert INTO table(field1,field2,...) values(value1,value2,...)這種形式的在應用程式開發中必不可少。但

select into insert into select

rim database ble spa ins data weight font insert select into:   創建測試語句 create database MyDemoTest go use MyDemoTest go create table A (

SELECT INTO INSERT INTO SELECT 復制語句

from 分享 目標表 lec table text 一個 ima 數據 from:http://www.cnblogs.com/freshman0216/archive/2008/08/15/1268316.html Insert是T-sql中常用語句,Inser

create table select from insert into table select from區別

create table select from 和 insert into table select from都是用來複製表,兩者的主要區別為: create table select from 要

SELECT INTO INSERT INTO SELECT

我們經常會遇到需要表複製的情況,如將一個table1的資料的部分欄位複製到table2中,或者將整個table1複製到table2中,這時候我們就要使用SELECT INTO 和 INSERT INTO SELECT 表複製語句了。 1.INSERT INTO SELE

1、SQL Server:SELECT INTO INSERT INTO SELECT

做資料庫開發的過程中難免會遇到有表資料備份的,而SELECT INTO……和INSERT INTO SELECT…… 這兩種語句就是用來進行表資料複製,下面簡單的介紹下: 1、INSERT INTO SELECT 語句格式:Insert Into Table2(column1,column2……) Sele

mybatis使用replace into insert INTO … ON DUPLICATE KEY UPDATE批量操作

一、replace into <insert id=“a" useGeneratedKeys="true"> REPLACE INTO table_name (product_id,departs_date,price_value) VALUES

oracle的select into冒號等於的賦值方式

1:冒號等於賦值 單個賦值 declare v_name varchar2(10); begin v_name:='夢夢'; 2:select into 賦值 select 列名 into

insert into複製插入方法

  insert into 語句除了基本的 insert into 表名(a,b,c)values(a1,b1,c1)外 。  還有更進一步的,從一個表複製其中全部欄位資料或者是部分欄位資料插入到另一個表中的用法。  有兩種方式可以實現,insert into select

c++建構函式成員初始化賦值初始化列表方式的區別

先總結下: 由於類成員初始化總在建構函式執行之前 1)從必要性:      a. 成員是類或結構,且建構函式帶引數:成員初始化時無法呼叫預設(無參)建構函式      b. 成員是常量或引用:成員無法賦值,只能被初始化 2)從效率上:     如果在類建構函式裡賦值:在成員

Javax+=yx=x+y實現的區別

先看下邊兩段程式碼,各有什麼錯? 例一: short s1 = 1; s1 = s1 + 1; 例二: short s1 = 1; s1 += 1; 第一段程式碼無法通過編譯,由於 s1+1 在運算時會自動提升表示式的型別至 int 型,再賦值給 short 型別的 s1

MySqlIFNULL、CONCATINSERT INTO...SELECT FROM多複製的介紹

這幾天做一個功能,對資料庫中存在的資料進行統計,涉及到多表操作,這讓我想到之前在實習公司做的功能,都是統計和校驗資料,我做的方法就是先將資料查找出來,然後迴圈操作!在實習公司做功能花了一個星期,然後我的Mentor看到後,無力的笑著對我說,“你這樣做到後來會將資

sql語句insert insert into 的區別?into有什麼用?

insert into tableName values(........)insert tableName (欄位名1,欄位名2,。。。)values(。。。。。。)看語句結構就知道區別了 。insert into 是直接對應表所有欄位,values裡必須包含所有欄位。insert是指定欄位對應,value

SQL複製資料select * intoinsert into

SQL複製資料表 (select * into 與 insert into)   select * into 目標表名 from 源表名 where ..... insert into 目標

ORACLE ROWNUM用法、select intoinsert into區別、merge into的使用、遞迴查詢

ROWNUM用法 ORACLE 中ROWNUM用法總結! 對於 Oracle 的 rownum 問題,很多資料都說不支援>,>=,=,between...and,只能用以上符號(<、<=、!=),並非說用>,& gt;=,=,between..and 時會

Mysql replace intoinsert into on duplicate key update 死鎖效能測試

1   編寫目的 1.  測試 replace into 引發死鎖 2.  測試 replace 和INSET INTO  ***  ON DUPLICATE KEY UPDATE *** 效能差 2   資料庫環境說明 1、 資料庫系統: 名稱:Mysql 5.5.31

臨時SELECT INTOINSERT INTO SELECT

本文為其他兩位作者作品的結合。 原連結:http://www.cnblogs.com/jeffwongishandsome/archive/2009/08/05/1526466.html http://www.cnblogs.com/freshman0216/archiv