轉表存儲

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語句實現。具體情形是:有三張表a、b、c,現在需要從表b和表c中分別查幾個字段的值插入到表a中對應的字段。對於這種情況,我們可以使用如下的語句來實現:

1.

      當然,上面的語句比較適合兩個表的數據互插,如果多個表就不適應了。對於多個表,我們可以先將需要查詢的字段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 (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(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不會在從屬服務器中產生與主服務器不一樣的數據。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章