Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 对于表中的每条记录,在另一个表中插入一条记录,并将键放入第一个表的记录中_Mysql - Fatal编程技术网

Mysql 对于表中的每条记录,在另一个表中插入一条记录,并将键放入第一个表的记录中

Mysql 对于表中的每条记录,在另一个表中插入一条记录,并将键放入第一个表的记录中,mysql,Mysql,我正在本地化一个应用程序,需要将现有的文本列转换为文本的多个翻译版本 原始表如下所示: 人 人名:INT 描述:VARCHAR20 其他栏目 为了存储本地化文本,我创建了一个新表: 文本 textId:INT自动递增 languageId:INT 文本:文本 我想用新的person.descTextId列替换person.description列 对于描述列中有值但descTextId为空的每个人: 插入带有此人英文描述的新文本记录 languageId=1 将此人的descTextId更新为新

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

原始表如下所示:

人 人名:INT 描述:VARCHAR20 其他栏目 为了存储本地化文本,我创建了一个新表:

文本 textId:INT自动递增 languageId:INT 文本:文本 我想用新的person.descTextId列替换person.description列

对于描述列中有值但descTextId为空的每个人:

插入带有此人英文描述的新文本记录 languageId=1 将此人的descTextId更新为新的textId 价值 然后删除person.description列


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

我通过一个临时过程和循环解决了这个问题

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;