1

我不知道在 MySQl 中是否可能,但我必须将旧数据库表导入新的规范化数据库表。我在新表中有 2 个表用户和 user_roles,而前一个表只有管理员

newdb.users 表
用户 ID | 用户名 | 密码

newdb.user_roles 表
用户 ID | 角色 ID

旧数据库表

olddb.admin 表
编号 | 用户名 | 密码 | 用户类型
1 | 用户1 | *** | 行政
3 | 用户7 | *** | 职员

admin role_id 为 1,员工 role_id 为 2

所以 SQL 插入后的新表应该是这样的。

newdb.users 表
用户 ID | 用户名 | 密码
1 | 用户1 | ***   
3 | 用户7 | ***   

newdb.user_roles 表
用户 ID | 角色 ID
1 | 1
3 | 2

如何使用 MYSQL 查询来做到这一点。谢谢。

4

2 回答 2

2

您应该将此信息基于roles表格:

create table roles (
    int id auto_increment primary key,
    role_name varchar(255)
);

insert into roles (role_name)
    select distinct user_type
    from old.admin;

然后:

insert into new.users(username, password)
    select distinct username, password
    from old.admin;

distinct如果username在原表中没有重复,则不需要。)

和:

insert into user_roles(user_id, role_id)
    select u.id, r.id
    from new.users u join
         old.admin a
         on u.user_name = a.user_name and
            u.password = a.password join  -- this condition may not be necessary
         new.roles r
         on a.user_type = r.role_name;

尽管您可以将值硬编码到查询中,但我认为让数据库为您完成工作是个好主意。这种方法更通用。

于 2016-08-06T13:34:46.747 回答
0

为了将旧表中的角色插入新表:

INSERT INTO newdb.user_roles 

SELECT 
id,
CASE WHEN user_type='admin' THEN 1
     WHEN user_type ='staff' THEN 2 END AS role_id
FROM olddb.admin 

为了将用户从旧表插入新表:

INSERT INTO newdb.users
SELECT 
id,
username,
password
FROM olddb.admin
于 2016-08-06T13:26:19.287 回答