程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> mysql不同數據庫不同數據表導入數據

mysql不同數據庫不同數據表導入數據

編輯:關於MYSQL數據庫

背景

現在我有這麼一個需求:

數據庫A的user表需要導入到數據庫B的account表
user表字段:uid,username,email,password,regdate,salt
account表字段:id,name,email,password,type,salt
導入的字段只有username,email,password,salt,並且regdate需要符合某個條件
下面分幾種情況來寫sql,主要區分insert into和replace into

情況

導入的數據在B庫的表中完全不存在

直接insert into就好,使用replace into效果一樣

INSERT INTO `B`.`account`(NAME,PASSWORD,email,salt)
SELECT username,PASSWORD,email,salt
FROM `A`.`users`
WHERE regdate>1418313600

導入的數據部分存在

數據部分存在為了區分需要在兩個表添加唯一索引,這個唯一索引(UNIQUE)必須是導入的字段裡面的值
我在兩個表中分別為username和name字段添加唯一索引
直接替換

replace into在操作的時候如果兩表數據重復(必須定義UNIQUE),會先刪掉那一行(注意是一整行),然後再執行insert into

造成的後果就是,account表中的type字段如果原來有值,會直接刪掉,並重新插入,即變成默認值了

REPLACE INTO `B`.`account`(NAME,PASSWORD,email,salt)
SELECT username,PASSWORD,email,salt
FROM `A`.`users`
WHERE regdate>1418313600

忽略重復

用IGNORE關鍵字,如果遇到重復,不會操作當前行

INSERT IGNORE INTO `B`.`account`(NAME,PASSWORD,email,salt)
SELECT username,PASSWORD,email,salt
FROM `A`.`users`
WHERE regdate>1418313600

部分更新

比如果只想更新password和salt字段,可以用ON DUPLICATE KEY UPDATE

INSERT INTO `B`.`u_account`(NAME,PASSWORD,email,salt)
SELECT username,PASSWORD,email,salt
FROM `A`.`bbs_ucenter_members`
WHERE regdate>1418313600 ON DUPLICATE KEY UPDATE PASSWORD=VALUES(PASSWORD),salt=VALUES(salt)

總結

replace into比較暴力,網上也有說慎重使用的,最好用insert into代替

疑問

以上的操作是兩個數據庫在同一台服務器上的,直接一條sql就可以搞定
假如要導的兩個庫在不同的兩個服務器上要怎麼做啊?
目前暫時的辦法:
將A庫中的user表導入到B庫所在的另一台服務器上,然後寫一條sql搞定
或者查詢出指定數據,導出sql,在sql中將insert into替換為insert ignore into(有局限性)

以上所述就是本文的全部內容了,希望大家能夠喜歡。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved