首页 > 解决方案 > 将列从一个表复制到另一个表,但它会挂起 DB Browser for SQLite

问题描述

我想将一个表的列复制到另一个表的列,条件是两个员工 id 应该相等,超过 30 万条记录。

以下是我的查询

UPDATE emp SET emp.address = (
    SELECT emp_address
    FROM address
    WHERE emp.emp_id=address.emp_id LIMIT 1
);

我从过去 1 小时开始执行此查询,但仍在进行中,我已在“DB Browser for SQLite”上执行此查询。

我有什么错误吗?还是sqlite浏览器有问题?

标签: sqlsqlite

解决方案


对于此查询:

UPDATE emp
    SET emp.address = (SELECT a.emp_address
                       FROM address a
                       WHERE e.emp_id = a.emp_id 
                       LIMIT 1
                      );

你想要一个关于address(emp_id, emp_address).

emp(emp_id)此查询不应使用索引,并且没有用处。如果您在 上有一个索引emp(address),您可能希望删除它并在更新后重新创建它。

话虽如此,您正在更新表中的所有记录。这是昂贵的。

重新创建表通常更快。像这样的东西:

create table temp_emp as 
    select . . . ,  -- all columns except address
           (select a.emp_address
            from address a
            where e.emp_id = a.emp_id 
            limit 1
           ) as address
    from emp;

truncate table emp;   -- backup the data first!

insert into emp ( . . . )  -- list the columns here
    select . . .
    from temp_temp;

您可以创建临时表并查看需要多长时间(使用上述索引)。截断并且insert不应该花费很长时间。但请先备份数据!


推荐阅读