2011-05-24 62 views
2

我有一个表有26列与几千条记录。 有没有办法批量更新此表?批量更新巨大的表

现在我只需要对每列需要更新的标准更新。 例如

update mytbl 
set col1 = replace(....) 

update mytbl 
set col1 = col1 + "xyz" 

update mytbl 
set col2 = "test..." 

我知道,每个记录的上述声明将首先前往下一列(S)之前更新所有记录的列。

我正在寻找“快速批量更新”,因为这需要太长时间。

感谢

+1

每列的标准是否有所不同?例如,只有当x是tue时更新第1列,y时是第2列还是所有列的标准相同? – BugFinder 2011-05-24 10:56:22

+0

不同的标准是。 – Ernesto 2011-05-24 11:16:24

回答

1

您可以使用此结构:

UPDATE myTable 
SET col1 = REPLACE(col1.....), 
    col2 = 'some value' 
+0

可以这样来完成: 更新mytable的 集COL1 =替换(COL1 ...), COL1 = COL1 +“一些价值”,试图通过所建议的更新比一次更COL1在MULTICOL更新时 – Ernesto 2011-05-24 11:22:36

+0

错误回报ck .. 在同一SET子句中,不能为列分配多个值。 – Ernesto 2011-05-24 11:46:56

+0

@Ernesto - 你可以发布你的SQL(编辑你的问题来添加它)和完整的错误信息。这将有助于发现问题。 – Tony 2011-05-24 12:36:44

1

1 - 一对夫妇一千记录×26场并不大:)

2 - 无论是使用多字段更新语法ck建议,或将其插入可能更快的新表格中:

SELECT (REPLACE(col1...)) as Col1, 
     'Some Value' as Col2, 
     ... 
INTO MyNewTable 
FROM MyOldTable 
+0

至少有600 000条记录。 我在一列上做了多个更新,直到数据的格式为必需。 E.G. urlcol可能有价值http://www.test.com/tess/1234/zap。PHP 我然后做一个更新删除HTTP://部分 然后 另一个更新删除任何东西后.COM 结果urlcol然后www.test.com 一些列我只能从其他信息更新列 – Ernesto 2011-05-24 11:07:43

+0

正如您所提到的,该操作将在1个表上执行。这意味着查询不会有任何连接。那么别担心。 JNK - “INTO MyNewTable”我认为,我们可以直接在目标表上执行update语句而不会引入第二个表? – Pankaj 2011-05-24 11:21:08

+0

我参加了约120万次赛事的测试,耗时19分钟。 – Ernesto 2011-05-24 11:26:50

0

这些advic由CK

  1. 如果有可能锁定在更新过程中进行独占访问表的建议 1.使用万事更新:ES是记录更大数量更为有用,但无论如何可能的帮助。

  2. 禁用所有索引。更新完成后还原它们。

0

请注意以下几点。

  1. 您可以使用SQL事件探查器来检查在更新过程中是否有任何触发器正在执行某些操作。

  2. 您可以禁用索引。现在运行你的测试并最终恢复它。