mysql不同數(shù)據(jù)庫不同數(shù)據(jù)表導入數(shù)據(jù)
今天在一個庫里面相互到兩張表的數(shù)據(jù),我之前只會一種方法:
- INSERT INTO A SELECT * FROM B;
這個方法的意思是將b表的所有數(shù)據(jù)全部導入到a表中,注意:
a、b表的數(shù)據(jù)結(jié)構(gòu)相同;
相當于復制了b表數(shù)據(jù)到a表
這樣可以簡單完成功能,但是當需求變成這樣:
a、b表數(shù)據(jù)結(jié)構(gòu)不一樣;
或者只需導一部分數(shù)據(jù)
或者導入數(shù)據(jù)是有重復的
這個sql就無能為力了,我們以各種情況來說。
首先有a表,結(jié)構(gòu)如下:
- CREATE TABLE `table_a` (
- `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵,長整型,自增',
- `user_id` varchar(32) DEFAULT NULL COMMENT '用戶id',
- `name` varchar(50) DEFAULT NULL COMMENT '名字',
- `email` varchar(30) NOT NULL COMMENT '郵箱',
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
然后是b表,結(jié)構(gòu)如下,
- CREATE TABLE `table_b` (
- `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵,長整型,自增',
- `user_id` varchar(32) DEFAULT NULL COMMENT '用戶id',
- `user_name` varchar(50) DEFAULT NULL COMMENT '名字',
- `email` varchar(30) NOT NULL COMMENT '郵箱',
- `course` varchar(30) NOT NULL COMMENT '課程',
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
情形如下:
(1)導入的數(shù)據(jù)在a表中完全不存在
- INSERT INTO table_a (id,user_id,name,email) SELECT id,user_id,user_name,email FROM table_b;
或者不需要id的情況,
- INSERT INTO table_a (user_id,name,email) SELECT user_id,user_name,email FROM table_b;
如果有重復的可以使用replace into 這個,但是請慎重使用replace,保證你對replace有足夠的了解!
(2)導入的數(shù)據(jù)部分存在
數(shù)據(jù)部分存在為了區(qū)分需要在兩個表添加唯一索引
兩個表中分別為user_name和name字段添加唯一索引
第一種情形,
使用replace into的方式進行導入數(shù)據(jù)(這里根據(jù)唯一索引進行判斷,如果不添加唯一索引的方式,除了id主鍵不同外,其他均相同的情況下也視為相同)
第二種情形,
忽略重復的,即如果有發(fā)現(xiàn)重復的行,則跳過此行數(shù)據(jù)的插入,必須使用ignore關(guān)鍵字,
- INSERT IGNORE INTO table_a (id,user_id,name,email) SELECT id,user_id,user_name,email FROM table_b;