SQLITE:用索引替换另一个表的高度冗余

时间:2019-02-20 00:09:35

标签: sqlite indexing

我有一个包含约500,000行的表t。其中一列(stringtext包含一个很长的字符串,我现在发现实际上只有80个不同的字符串。我想通过将字符串移到单独的表t中并仅在s中引用它们来整理表t

我使用长字符串创建了一个单独的表,其中包括有效的显式行索引号:

CREATE TEMPORARY TABLE stmp AS
  SELECT DISTINCT
    stringtext
  FROM t;
CREATE TABLE s AS
  SELECT _ROWID_ AS stringindex, stringtext
  FROM stmp;

(正在创建此表,向我显示只有几个不同的字符串)。

现在如何用t中的相应字符串索引替换s中的字符串文本?

1 个答案:

答案 0 :(得分:1)

我会考虑类似<?php class UpperNameApi extends SugarApi { public function registerApiRest() { return array( 'UpperNameRequest' => array( //request type 'reqType' => 'POST', //endpoint path 'path' => array('Leads', 'UpperName'), //endpoint variables 'pathVars' => array('module',''), //method to call 'method' => 'UpperNameMethod', //short help string to be displayed in the help documentation 'shortHelp' => 'Example endpoint', //long help to be displayed in the help documentation 'longHelp' => 'custom/clients/base/api/help/MyEndPoint_MyGetEndPoint_help.html', ), ); } public function UpperNameMethod($api, $args) { if (isset($args['record']) && !empty($args['record'])) { $bean = BeanFactory::getBean('Leads', $args['record']); if (!empty($bean->id)) { $first = $bean->first_name; $first = ucwords($first); $bean->first_name = $first; $last = $bean->last_name; $last = ucwords($last); $bean->last_name = $last; $bean->save(); } return 'success'; } return 'failed'; } } 的事情,并建议首先在Update t set stringtext = (select stringindex from s where s.stringtext = t.stringtext)上建立索引,因为SQLite可能不够聪明,无法建立临时索引。然后将进行VACUUMing。

未经测试。