对于表中的每个记录,在另一个表中插入记录并将密钥放入第一个表的记录中

时间:2017-12-07 16:57:21

标签: mysql

我正在本地化一个应用程序,需要将现有的TEXT列转换为文本的多个翻译版本。

原始表格如下:

  • personId:INT
  • description:VARCHAR(20)
  • (其他栏目)

为了存储本地化文本,我创建了一个新表:

文本

  • textId:INT(自动递增)
  • languageId:INT
  • text:TEXT

我想用一个新的person.descTextId列替换person.description列。

对于在description列中具有值但descTextId为null的每个人:

  1. 使用该人员的说明插入新的文字记录(英文 languageId = 1)
  2. 将此人的descTextId更新为新textId 值
  3. 然后删除person.description列。

    最干净的方法是什么?我是否需要创建一个过程和游标,或者是否有一个聪明的MySQL语法可以帮助解决这个问题?你会怎么做?

1 个答案:

答案 0 :(得分:0)

我用临时程序和循环来解决它。

DROP PROCEDURE IF EXISTS moveToTextTable;
DELIMITER ;;

CREATE PROCEDURE moveToTextTable()
BEGIN
  DECLARE n INT DEFAULT 0;
  DECLARE i INT DEFAULT 0;
  DECLARE id INT DEFAULT 0;

  SELECT COUNT(*) INTO n FROM person WHERE description IS NOT NULL AND description <> '';
  WHILE i<n DO
    SELECT personId INTO id FROM person WHERE description IS NOT NULL AND description <> '' AND descTextId IS NULL LIMIT 1;
    INSERT INTO text (languageId, text) SELECT 1, description FROM person WHERE personId = id;
    UPDATE person SET descTextId = LAST_INSERT_ID() WHERE personId = id;
    SET i = i + 1;
  END WHILE;
END;
;;

DELIMITER ;
CALL moveToTextTable();
DROP PROCEDURE IF EXISTS moveToTextTable;