跳转到内容

mysql合并两张字段相同的表

sql
--查询 A 库中总共有多少条记录
SELECT
 COUNT(*)
FROM
 A.users

--查询 A 库中 users 总共有多少条记录
SELECT
 COUNT(A.users.username)
FROM
 A.users

--查询 A 库中 users 表中的 username 和 B 库中 users 表中的 username相同的数据
SELECT
 A.users.*,
 B.users.*
FROM
 A.users,
 B.users
WHERE
 A.users.username = B.users.username
 -- 限制15条记录
 -- LIMIT 15

-- 查询两个表中相同字段的字段总共有多少条
SELECT
 COUNT(*)
FROM
 A.users,
 B.users
WHERE
 A.users.username = B.users.username

-- 合并两张字段相同的表,主键id自增,如果某个字段的值相同则不合并
-- 下面的示例是将B库的 users 表插入到A库的 users 表,
-- A库的 users 表和B库的 users 表字段结构相同,id 为自增主键,
-- 如果A库的 users 表的username和B库的 users 表的username相等则忽略该条记录
INSERT INTO A.users
SELECT
 ( CASE B.users.id WHEN NOT NULL THEN NULL  END ) id ,
 B.users.username,
 B.users.age,
FROM
 B.users
WHERE
 B.users.username NOT IN (
  SELECT
   A.users.username
  FROM
   A.users
  )
 --限制10条记录
 -- LIMIT 10

-- 合并两张字段相同的表,主键id自增,如果某个字段的值相同则不合并
-- 下面的示例是将B库的 users 表插入到A库的 users 表,
-- A库的user表和B库的 users 表字段结构相同,id为自增主键,
-- 如果A库的user表的username,createdAt和B库的user表的username,createdAt相等则忽略该条记录
INSERT INTO A.users
SELECT
 ( CASE B.users.id WHEN not NULL THEN NULL  END ) id ,
 B.users.username,
 B.users.age,
FROM
 B.users
WHERE
 B.users.username NOT IN (
 SELECT
  A.users.username
 FROM
  A.users
 )
 OR
 B.users.createdAt NOT IN (
 SELECT
  A.users.createdAt
 FROM
  A.users
 )
 --限制10条记录
 -- LIMIT 10


下面是将两个库 A 和 B 中根据users表的username字段相同的数据
根据 B 库中 users_bak 中 username 合并 B 库的 subject 表到 A 库的 subject 表,

--第一步:
-- 在 B 库复制 users 表结构到新表users_bak
-- 查询 A 库中的 users 表中的 username 和 B 库中的 users 表中的 username 不相同的数据
-- 将不相同的数据插入到 B 库 users_bak 表中
INSERT INTO B.users_bak
SELECT
( CASE A.users.id WHEN NOT NULL THEN NULL END ) id,
 A.users.username,
 A.users.age,
FROM
 A.users
WHERE
 A.users.username NOT IN (
  SELECT
   B.users.username
  FROM
   B.users
  )

-- 第二步:
-- 查询 B 库中 subject 表中的 username 和 B 库中 users_bak 表中的 username 相同的数据
-- 将相同的数据中的 username 加后缀 '_test' 插入到 A 库 users 表中
INSERT INTO A.subject
SELECT
 ( CASE B.subject.id WHEN NOT NULL THEN NULL END ) id,
 ( CASE B.subject.username WHEN B.subject.username THEN CONCAT( B.subject.username, '_test' ) END ) username,
  B.subject.age,
FROM
 B.subject
WHERE
 B.subject.username IN ( SELECT B.users_bak.username FROM B.users_bak )