溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

INSERT INTO SELECT 語句及使用

發布時間:2020-05-28 14:53:26 來源:網絡 閱讀:10593 作者:瘋狂烤翅 欄目:MySQL數據庫

SQL里怎么把一個數據庫的表復制到另一個數據庫?


1.
SELECT * INTO 表1 FROM 表2 --復制表2
如果只復制結構而不復制內容或只復制某一列
只要加WHERE條件就好

2.
假設你有數據庫A和數據庫B,現將數據庫A中的Table_A的數據復制到數據庫B中的Table_B,語句
1如果Table_A和Table_B的結構一樣:
use B
insert into Table_B select * from A.dbo.Table_A
2如果Table_A和Table_B的結構一樣:
insert into Table_B(B字段1B字段2...) select A字段1A字段2... from A.dbo.Table_A


上面的兩個實例用到了select into from 和 insert into select ,那么這兩個語法有什么不同哪?

select into from 和 insert into select都是用來復制表,兩者的主要區別為: select into from 要求目標表不存在,因為在插入時會自動創建。insert into select from 要求目標表存在

備份表數據: create table emp as select from scott.emp
還原表數據:insert into emp select
from scott.emp

  1. 復制表結構及其數據:

create table table_name_new as select * from table_name_old

  1. 只復制表結構:

create table table_name_new as select * from table_name_old where 1=2;

或者:

create table table_name_new like table_name_old

  1. 只復制表數據:

如果兩個表結構一樣:

insert into table_name_new select * from table_name_old

如果兩個表結構不一樣:

insert into table_name_new(column1,column2...) select column1,column2... from table_name_old

pasting



再次對使用SELECT INTO 和 INSERT INTO SELECT 表復制語句了,進行說明

1.INSERT INTO SELECT語句
語句形式為:Insert into Table2(field1,field2,...) select value1,value2,... from Table1 [where column =value]
[]為可選內容
要求目標表Table2必須存在,由于目標表Table2已經存在,所以我們除了插入源表Table1的字段外,還可以插入常量。示例如下:
insert into tjjrmx(yybh,xh,tjxmbh,jg,sfyx,zhxmbh,tjksbh,jcrq,jcys,ts,ckfw,disporder)
select '24',xh,tjxmbh,jg,sfyx,zhxmbh,tjksbh,jcrq,jcys,ts,ckfw,disporder from tjjrmx where yybh = 5
2.SELECT INTO FROM語句
語句形式為:SELECT vale1, value2 into Table2 from Table1
要求目標表Table2不存在,因為在插入時會自動創建表Table2,并將Table1中指定字段數據復制到Table2中。示例如下

        -------------------------------------------------------------------------------------------------------------------
        實戰例1

        如何在mysql從多個表中組合字段然后插入到一個新表中(特別是在多個表的數據集中到一個表時),通過一條sql語句實現。具體情形是:有三張表a、b、c,現在需要從表b和表c中分別查幾個字段的值插入到表a中對應的字段。對于這種情況,我們可以使用如下的語句來實現:

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

     當然,上面的語句比較適合兩個表的數據互插,如果多個表就不適應了。對于多個表,我們可以先將需要查詢的字段join起來,然后組成一個視圖后再select from就可以了:

2.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的形式來組合字段。需要注意的是嵌套查詢部分最后一定要有設置表別名,如下:
2.2 SELECT
FROM(SELECT f1,f2 FROM b JOIN c) AS tb

即最后的as tb是必須的(當然tb這個名稱可以隨意?。?,即指定一個別名,否則在mysql中會報如下錯誤:
2. 3 ERROR 1248 (42000): Every derived TABLE must have its own alias
即每個派生出來的新表都必須指定別名才可以的。

    ***********************************************************************************************************
    實戰例2

    insert觸發器 insert into select同時插入多條記錄  

需求:寫了一個FOR INSERT的觸發器,每次插入數據的時候向相關的數據表中也同時插入數據。
問題:測試的時候,一次只向主表中插入一條記錄,那么觸發器沒有問題。在實際使用的時候,因為使用了insert into select語句,一次向主表中插入了超過一條的記錄,如17條,但是發現其他數據表中卻都只有一條記錄,明顯出現了錯誤。
解決:
1、上網查詢“一次插入多條”這樣的關鍵字
2、通過在觸發器中書寫:select count(*) from inserted,的確可以看到一次插入了多條
3、網上說用“游標”來實現
分析:
1、其實不用右邊也可以,如果只是把插入的數據直接插入其他相關的數據表,完全可以使用insert into (select from inserted)來實現。
例如:
CREATE TRIGGER TriInsertStoreFile ON tblStore
FOR INSERT
AS

BEGIN
Insert into storeFile(storeID) (SELECT storeID FROM INSERTED)
END
2、而我在實際應用中,還存在與storeFile關聯的storeFileItem數據表,要用插入storeFile時自動生成的主鍵FileID,插入storeFileItem中作為外鍵關聯,看來只有用"游標"了,其實也不難

CREATE TRIGGER TriInsertStoreFile ON tblStore
FOR INSERT
AS

DECLARE @storeID int
DECLARE @FILEID int

SET @storeID=0
SET @FILEID=0

DECLARE stores_cursor CURSOR FOR
SELECT storeID FROM Inserted

OPEN stores_cursor

FETCH NEXT FROM stores_cursor
INTO @storeID

WHILE @@FETCH_STATUS = 0
BEGIN
Insert into storeFile(storeID) (SELECT storeID FROM INSERTED)
SET @FILEID=@@identity
Insert into storeFileItem(fileID) values(@FILEID)

           FETCH NEXT FROM stores_cursor   INTO @storeID

END

CLOSE stores_cursor
DEALLOCATE stores_cursor

總算解決問題。
最后能把對其他數據表的插入寫在單獨的存儲過程中,就更理想了

sqlserver在觸發器中執行動態sql用到inserted(deleted)表

這兩天公司產品中要加個數據同步用的觸發器,oracle版沒什么問題,很順利的寫完了。

  在寫sqlserver版時遇到了麻煩。由于在觸發器中要根據inserted(deleted)表的數據,對另一個表進行更新操作,而這個表的某些字段是不固定的,所以需要寫成動態sql,利用exec來執行。這時麻煩來了,exec執行時,無法訪問到inserted(deleted)表。壞了,這該如何是好?

經反復google+baidu+試驗,問題總算解決了??偨Y一下,大致有以下兩種方法:

  1、將inserted(deleted)表的數據放到臨時表#temp,然后再來exec;

  2、用游標對inserted(deleted)表進行逐條處理。

具體采用哪種,可根據業務特點來定

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女