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不會在從屬服務器中產生與主服務器不一樣的數據。