数据库
首页 > 数据库> > mysql-用外键将表拆分成两个表

mysql-用外键将表拆分成两个表

作者:互联网

我有一个表:drupal.comments,以及其他各列:

cid: primary key
uid: foreign key to users table, optional
name: varchar, optional
email: varchar, optional

描述说:UID是可选的,如果为0,则匿名注释.在这种情况下,将设置名称/电子邮件.

我想将其分为两个表rails.comments和rails.users,其中始终有一个用户:

id: primary key
users_id:  foreign key, always set.

因此,对于每个drupal.comment,我需要从drupal.comments.name/drupal.comments.email创建一个新用户,以及一个rails.comment,其中rails.comment.users_id是刚刚创建的用户的ID.

或者,如果rails.user的用户名/电子邮件已经存在,则需要获取该users_id并将其用于新注释记录作为外键.

或者,如果设置了drupal.comment.uid,则需要将其用作users_id.

在SQL中这可能吗?在SQL中是否可以从一个来源获取但填写多个表的查询?还是有一些(My)SQL技巧来实现这一目标?还是应该只用Ruby,PHP或其他某种语言编写脚本?

解决方法:

您可以使用TRIGGER进行此操作.

以下是一些伪代码来说明此技术:

DELIMITER $$

DROP TRIGGER IF EXISTS tr_b_ins_comments $$

CREATE TRIGGER tr_b_ins_comments BEFORE INSERT ON comments FOR EACH ROW BEGIN
  DECLARE v_uid INT DEFAULT NULL;

  /* BEGIN pseudo-code */
  IF (new.uid IS NULL)
  THEN
    -- check for existing user with matching name and email address
    select user_id
    into v_uid
    from your_user_table
    where name = new.name 
    and email = new.email;

    -- if no match, create a new user and get the id
    IF (v_uid IS NULL)
    THEN
      -- insert a new user into the user table
      insert into your_user_table ...

      -- get the new user's id (assuming it's auto-increment)
      set v_uid := LAST_INSERT_ID();
    END IF;

    -- set the uid column
    SET new.uid = v_uid;
  END IF;

  /* END pseudo-code */
END $$

DELIMITER ;

标签:data-migration,mysql
来源: https://codeday.me/bug/20191013/1910807.html