【问题标题】:Copy column from one table to another table but it hangs DB Browser for SQLite将列从一个表复制到另一个表,但它挂起 DB Browser for SQLite
【发布时间】:2019-11-27 07:04:26
【问题描述】:

我想将一个表的列复制到另一个表的列,条件是两个员工 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浏览器有问题?

【问题讨论】:

  • 我可以建议检查emp.address 是否有任何索引,如果是,请删除它们。并检查address.emp_id 是否有任何索引,如果没有则添加一个。如果仍然需要很长时间,您可以添加一个临时字段作为更新标志,并尝试分块更新您的数据库。或者您可以尝试增加页面和缓存大小并关闭日志。
  • emp.emp_id 上有一个索引,现在我已经删除并执行了查询让我检查它是否工作
  • 不,你不应该删除它。它会减慢您的查找时间。仅删除对列执行更新的索引。
  • 我已经尝试过删除和不删除两种方式,但它不起作用,我等了 1.5 小时但没有任何反应,所以我退出了

标签: sql sqlite


【解决方案1】:

对于这个查询:

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 不应该花费很长时间。但请先备份数据!

【讨论】:

  • 一定会检查并提前告知您
  • 不知道,但 sqlite 可能不支持它我收到类似 Result: near "as": syntax error At line 1: CREATE TABLE TEMP_EMP as SELECT (
  • @SiddhpuraAmit 。 . . SQLite 支持这种语法:sqlite.org/lang_createtable.html.
猜你喜欢
  • 2011-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 2012-08-12
  • 2021-01-01
  • 2012-07-21
相关资源
最近更新 更多