创建表作为从另一个中选择加入?

时间:2016-04-03 12:25:07

标签: mysql

我正在尝试更新一个大表,我被告知将创建表作为(选择)要快得多。例如,如果您想将1000万记录表中的Field1更新为UPPER,那么(显然)可以更快地完成

Create TableANew as (Select UPPER(Field1),Field2,FieldN from TableA); 
Drop Table TableA;
Rename Table TableANew to TableA

假设这是真的,那么如何更新字段需要作为连接完成?换句话说,如果我原来的计划是:

Update TableA as T1
Inner Join TableB as T2
On T1.Product=T2.Product
Set T1.ProductID=T2.ProductID

如何将更新合并到创建表中(从表中选择)结构?为了清楚起见,我使用了一个非常基本的Create Table as Select来显示该查询的结构,因为我理解它;我实际上需要一个创建表作为选择(字段,字段,连接)并且不清楚如何在第一个答案的上下文中设置它,虽然提供表的重命名的改进但是没有解决如何/如果我可以在Create as Select

中进行连接

1 个答案:

答案 0 :(得分:0)

我错过了join update正在做的事情。这两种方法是:

update tableA
    set a.field1 = upper(a.field1);

create table temp_tableA as
    select upper(a.field1) as field1, field2, field3
    from tableA;

-- check, check, check that the data is right

truncate table tableA;

insert into tableA(field1, field2, field3)
    select field1, field2, field3,
    from temp_tableA;

注意:最后两步可以使用rename。但是,此方法维护索引,外键关系和触发器(以及其他数据库约束)。

第一种方法显然更简单。但是,在大型表上,记录更新事务可能非常昂贵。通常,create table astruncate table和大insert比更新速度快。请注意,这也可以避免(无论好坏)任何更新触发器。