Excel, vynulování součtu po překročení zadané hodnoty



Ve sloupci Excel tabulky generuji pomocí funkce =RANDBETWEEN(15;60) náhodná čísla (čas v minutách) v rozsahu 15-60 minut, která pak v dalším sloupci (od začátku) sčítám. Pokud součet překročí hodnotu 474 minut, potřebuji nějak vynulovat součet a začít od nuly. Tabulku vytvářím tahem prvního řádku dolů. Jak to udělat ?
Domácí úkol.PrasatkoPee
<p>sloupec můžete třídit do sestupného formátu a poté pouze získat hodnotu z n-tého řádku.</p><p>upravit::</p><p>aktualizováno podle požadavku na komentář.<strong> <em>upozorněn&iacute;</em> </strong>zcela nevyzkoušené!</p><pre><code>select dob from (select dob from users order by dob desc) where rowid = 6 </code></pre><p>něco takového by mělo fungovat pro oracle ... možná budete muset nejprve dostat syntaxi!</p> <p>nejprve byste si měli být naprosto jistí, že musíte iterovat přes jednotlivé řádky - operace založené na sadě budou fungovat rychleji v každém případě, na který si pomyslím, a obvykle použiji jednodušší kód.</p><p>v závislosti na vašich datech může být možné opakovat smyčky pouze pomocí vybraných příkazů, jak je uvedeno níže:</p><pre><code>declare @id int while (select count(*) from atable where processed = 0) &gt; 0 begin select top 1 @id = id from atable where processed = 0 --do some processing here update atable set processed = 1 where id = @id end </code></pre><p>další alternativou je použití dočasné tabulky:</p><pre><code>select * into #temp from atable declare @id int while (select count(*) from #temp) &gt; 0 begin select top 1 @id = id from #temp --do some processing here delete #temp where id = @id end </code></pre><p>možnost, kterou byste si měli vybrat, opravdu závisí na struktuře a objemu vašich dat.</p><p><strong> poznámka: </strong> pokud používáte sql server, měli byste být lépe obsluhováni pomocí:</p><pre><code>while exists(select * from #temp) </code></pre><p>pomocí <code>count</code> se bude muset dotknout každého jednotlivého řádku v tabulce, <code>exists</code> se musí dotknout pouze prvního (viz <a href="https://stackoverflow.com/a/65294/963542">josefova odpověď</a> níže).</p> <p>tady je to, co jsem udělal předtím:</p><pre><code>(select 'tablea', * from tablea except select 'tablea', * from tableb) union all (select 'tableb', * from tableb except select 'tableb', * from tablea) </code></pre><p>funguje to dost dobře na stolech, které mají asi 1 000 000 řádků, ale nejsem si jistý, jak dobře by to fungovalo na extrémně velkých stolech.</p><p><strong>přidáno:</strong></p><p>spustil jsem dotaz proti svému systému, který porovnává dvě tabulky s 21 poli běžných typů ve dvou různých databázích připojených ke stejnému serveru se systémem sql server 2005. tabulka obsahuje asi 3 miliony řádků a liší se přibližně 25 000 řádků. primární klíč v tabulce je však zvláštní, protože se jedná o složený klíč z 10 polí (je to kontrolní tabulka).</p><p>plány provádění dotazů mají celkové náklady 184,255879 pro <code>union</code> a 184,228383 pro <code>union all</code>. cena stromu se liší pouze v posledním kroku před vrácením řádků, zřetězením.</p><p>skutečné provedení jednoho dotazu trvá asi 42 s plus asi 3 s, než se řádky skutečně přenesou. čas mezi dvěma dotazy je stejný.</p><p><strong>druhý dodatek:</strong></p><p>toto je ve skutečnosti <em> extrémně </em> rychlé, každý z nich běží proti 3 milionům řádků přibližně za 2,5 s:</p><pre><code>select checksum\_agg(binary\_checksum(*)) from tablea select checksum\_agg(binary\_checksum(*)) from tableb </code></pre><p>pokud se výsledky těchto neshodují, víte, že tabulky jsou odlišné. pokud se však výsledky <em> shodují </em>, nemáte <em> </em> zaručeno, že tabulky jsou totožné kvůli [velmi nepravděpodobné] možnosti kolize kontrolního součtu.</p><p>nejsem si jistý, jak změny datového typu mezi tabulkami ovlivní tento výpočet. spustil bych dotaz proti zobrazením <code>system</code> nebo <code>information\_schema</code> zobrazení.</p><p>zkoušel jsem dotaz proti jiné tabulce s 5 miliony řádků a ten běžel asi za 5 s, takže se zdá být převážně o (n).</p> <p>tabulky auditu se používají ke sledování transakcí s konkrétní tabulkou nebo tabulkami. umožňují vám vidět pokračující „deník“ (pro nedostatek lepšího slova). řekněme například, že máte takovou tabulku:</p><pre><code>create table sensitiveinformation ( sensitivenumber int not null, sensitivedata varchar(100) not null ) go </code></pre><p>mohou existovat uživatelé a/nebo aplikace, které mají přístup k vkládání, aktualizaci a mazání z této tabulky. ale vzhledem k citlivé povaze těchto dat možná budete chtít mít rychlý a snadný způsob, jak sledovat, kdo dělá to, co na této tabulce.</p><p>takže máte tabulku auditů, která sleduje, co se v této tabulce děje. obvykle to bude zahrnovat základní <strong>kdo</strong>, <strong>co</strong>, <strong>kdy</strong>.</p><p>tabulka auditů by mohla vypadat takto:</p><pre><code>create table sensitiveinformationaudit ( sensitivenumbernew int null, sensitivenumberold int null, sensitivedatanew varchar(100) null, sensitivedataold varchar(100) null, action varchar(50) not null, auditdate datetime not null, lastupdateduser varchar(100) not null ) go </code></pre><p>tabulky auditu se obvykle vyplňují pomocí databázových spouštěčů. jinými slovy, když se akce <code>x</code> stane na <code>sensitiveinformation</code>, vložte její podrobnosti do <code>sensitiveinformationaudit</code>.</p> <p>příkaz <code>merge</code> má složitou syntaxi a ještě složitější implementaci, ale v zásadě jde o spojení dvou tabulek, filtrování dolů na řádky, které je třeba změnit (vložit, aktualizovat nebo smazat), a poté provést požadované změny. vzhledem k těmto vzorovým údajům:</p><pre><code>declare @categoryitem as table ( categoryid integer not null, itemid integer not null, primary key (categoryid, itemid), unique (itemid, categoryid) ); declare @datasource as table ( categoryid integer not null, itemid integer not null primary key (categoryid, itemid) ); insert @categoryitem (categoryid, itemid) values (1, 1), (1, 2), (1, 3), (2, 1), (2, 3), (3, 5), (3, 6), (4, 5); insert @datasource (categoryid, itemid) values (2, 2); </code></pre><p><strong> cíl </strong></p><pre><code>╔════════════╦════════╗ ║ categoryid ║ itemid ║ ╠════════════╬════════╣ ║ 1 ║ 1 ║ ║ 2 ║ 1 ║ ║ 1 ║ 2 ║ ║ 1 ║ 3 ║ ║ 2 ║ 3 ║ ║ 3 ║ 5 ║ ║ 4 ║ 5 ║ ║ 3 ║ 6 ║ ╚════════════╩════════╝ </code></pre><p><strong> zdroj </strong></p><pre><code>╔════════════╦════════╗ ║ categoryid ║ itemid ║ ╠════════════╬════════╣ ║ 2 ║ 2 ║ ╚════════════╩════════╝ </code></pre><p>požadovaným výsledkem je nahrazení dat v cíli daty ze zdroje, ale pouze pro <code>categoryid = 2</code>. po výše uvedeném popisu <code>merge</code> bychom měli napsat dotaz, který spojuje zdroj a cíl pouze na klíče, a filtrovat řádky pouze v klauzulích <code>when</code>:</p><pre><code>merge into @categoryitem as target using @datasource as source on source.itemid = target.itemid and source.categoryid = target.categoryid when not matched by source and target.categoryid = 2 then delete when not matched by target and source.categoryid = 2 then insert (categoryid, itemid) values (categoryid, itemid) output $action, isnull(inserted.categoryid, deleted.categoryid) as categoryid, isnull(inserted.itemid, deleted.itemid) as itemid ; </code></pre><p>to dává následující výsledky:</p><pre><code>╔═════════╦════════════╦════════╗ ║ $action ║ categoryid ║ itemid ║ ╠═════════╬════════════╬════════╣ ║ delete ║ 2 ║ 1 ║ ║ insert ║ 2 ║ 2 ║ ║ delete ║ 2 ║ 3 ║ ╚═════════╩════════════╩════════╝ ╔════════════╦════════╗ ║ categoryid ║ itemid ║ ╠════════════╬════════╣ ║ 1 ║ 1 ║ ║ 1 ║ 2 ║ ║ 1 ║ 3 ║ ║ 2 ║ 2 ║ ║ 3 ║ 5 ║ ║ 3 ║ 6 ║ ║ 4 ║ 5 ║ ╚════════════╩════════╝ </code></pre><p>realizační plán je: <img src="https://i.stack.imgur.com/fovhu.jpg" alt="merge plan"></p><p>všimněte si, že jsou obě tabulky plně naskenovány. můžeme to považovat za neefektivní, protože pouze řádky, kde <code>categoryid = 2</code> bude ovlivněno v cílové tabulce. zde přicházejí varování v books online. jeden chybný pokus o optimalizaci, aby se dotkl pouze nezbytných řádků v cíli, je:</p><pre><code>merge into @categoryitem as target using ( select categoryid, itemid from @datasource as ds where categoryid = 2 ) as source on source.itemid = target.itemid and target.categoryid = 2 when not matched by target then insert (categoryid, itemid) values (categoryid, itemid) when not matched by source then delete output $action, isnull(inserted.categoryid, deleted.categoryid) as categoryid, isnull(inserted.itemid, deleted.itemid) as itemid ; </code></pre><p>logika v klauzuli <code>on</code> je použita jako součást spojení. v tomto případě je spojení úplným vnějším spojením (viz <a href="http://technet.microsoft.com/en-us/library/bb522522%28v=sql.105%29.aspx">tento záznam books online</a> proč). použití kontroly kategorie 2 na cílových řádcích jako součásti vnějšího spojení nakonec povede k odstranění řádků s jinou hodnotou (protože neodpovídají zdroji):</p><pre><code>╔═════════╦════════════╦════════╗ ║ $action ║ categoryid ║ itemid ║ ╠═════════╬════════════╬════════╣ ║ delete ║ 1 ║ 1 ║ ║ delete ║ 1 ║ 2 ║ ║ delete ║ 1 ║ 3 ║ ║ delete ║ 2 ║ 1 ║ ║ insert ║ 2 ║ 2 ║ ║ delete ║ 2 ║ 3 ║ ║ delete ║ 3 ║ 5 ║ ║ delete ║ 3 ║ 6 ║ ║ delete ║ 4 ║ 5 ║ ╚═════════╩════════════╩════════╝ ╔════════════╦════════╗ ║ categoryid ║ itemid ║ ╠════════════╬════════╣ ║ 2 ║ 2 ║ ╚════════════╩════════╝ </code></pre><p>kořenová příčina je ze stejného důvodu, proč se predikáty chovají v klauzuli vnější spojení <code>on</code> odlišně, než když jsou specifikovány v klauzuli <code>where</code>. syntaxe <code>merge</code> (a implementace spojení v závislosti na zadaných klauzulích) jen ztěžují vidět, že tomu tak je.</p><p> <a href="http://technet.microsoft.com/en-us/library/bb510625%28v=sql.105%29.aspx">navádění v books online</a> (rozšířeno v položce <a href="http://technet.microsoft.com/en-us/library/cc879317%28v=sql.105%29.aspx">optimizing performance</a> ) nabízí navádění, které zajistí, že správná sémantika je vyjádřena pomocí syntaxe <code>merge</code>, aniž by uživatel nutně musel muset pochopit všechny podrobnosti implementace nebo zohlednit způsoby, kterými by optimalizátor mohl legitimně přeskupit věci z důvodů efektivnosti provádění.</p><p>dokumentace nabízí tři možné způsoby implementace časného filtrování:</p><p><strong> zadání podmínky filtrování v klauzuli <code>when</code> </strong> zaručuje správné výsledky, ale může znamenat, že více řádků je čteno a zpracováno ze zdroje a cíle tabulky, než je nezbytně nutné (viz první příklad).</p><p><strong> aktualizace prostřednictvím zobrazení </strong>, která obsahuje podmínku filtrování, také zaručuje správné výsledky (protože změněné řádky musí být přístupné pro aktualizaci prostřednictvím zobrazení), ale vyžaduje to vyhrazené zobrazení, které splňuje liché podmínky pro aktualizaci zobrazení.</p><p><strong> použití společného výrazu tabulky </strong> přináší podobné riziko při přidávání predikátů k klauzuli <code>on</code>, ale z poněkud odlišných důvodů. v mnoha případech to bude bezpečné, ale vyžaduje to odbornou analýzu prováděcího plánu, aby se to potvrdilo (a rozsáhlé praktické testování). například:</p><pre><code>with target as ( select * from @categoryitem where categoryid = 2 ) merge into target using ( select categoryid, itemid from @datasource where categoryid = 2 ) as source on source.itemid = target.itemid and source.categoryid = target.categoryid when not matched by target then insert (categoryid, itemid) values (categoryid, itemid) when not matched by source then delete output $action, isnull(inserted.categoryid, deleted.categoryid) as categoryid, isnull(inserted.itemid, deleted.itemid) as itemid ; </code></pre><p>výsledkem jsou správné výsledky (neopakované) s optimálnějším plánem:</p><p><img src="https://i.stack.imgur.com/tazmk.jpg" alt="merge plan 2"></p><p>plán čte pouze řádky pro kategorii 2 z cílové tabulky. to může být důležitým hlediskem výkonu, pokud je cílová tabulka velká, ale je příliš snadné tuto chybu získat pomocí syntaxe <code>merge</code>.</p><p>někdy je snazší zapsat <code>merge</code> jako samostatné operace dml. tento přístup může dokonce <strong> vést lépe </strong> než jediný <code>merge</code>, což je skutečnost, která lidi často překvapuje.</p><pre><code>delete ci from @categoryitem as ci where ci.categoryid = 2 and not exists ( select 1 from @datasource as ds where ds.itemid = ci.itemid and ds.categoryid = ci.categoryid ); insert @categoryitem select ds.categoryid, ds.itemid from @datasource as ds where ds.categoryid = 2; </code></pre> <p>jaká je hodnota float\_one v době převodu ???</p><p>všimněte si tohoto příkladu z mysql 5.5.12 ve windows</p><pre><code>mysql&gt; select convert(20000,decimal(7,2)); ++ | convert(20000,decimal(7,2)) | ++ | 20000.00 | ++ 1 row in set (0.00 sec) mysql&gt; select convert(200000,decimal(7,2)); ++ | convert(200000,decimal(7,2)) | ++ | 99999.99 | ++ 1 row in set, 1 warning (0.00 sec) mysql&gt; show warnings; ++++ | level | code | message | ++++ | warning | 1264 | out of range value for column 'convert(200000,decimal(7,2))' at row 1 | ++++ 1 row in set (0.00 sec) </code></pre><p>je možné, že data byla zkrácena, pokud bylo číslo float\_one větší než 99999,99. možná, mysql převáděl float\_one a float\_two na decimal (7,2) individuálně před provedením dělení. zkuste použít decimal (10,2) nebo vyšší, aby se přizpůsobily velkým hodnotám.</p><p><strong> aktualizace 2011-07-25 15:05 edt </strong></p><p>zde se děje určitý problém se zkrácením</p><p>podle <a href="http://rads.stackoverflow.com/amzn/click/0596002653">mysql reference manual strana 442 body 2,</a> </p><blockquote> <p>hodnoty decimal a numeric se ukládají spíše jako řetězce než jako binární čísla s pohyblivou řádovou čárkou, aby se zachovala desetinná přesnost těchto čísel. jeden znak se používá pro každou číslici hodnoty, deciaml bod (pokud je měřítko&gt; 0) a znaménko - (pro záporná čísla). pokud je měřítko 0, hodnoty decimal a numeric neobsahují žádné desetinné tečky nebo zlomkovou část.</p> <p>maximální rozsah decimal a numeric je stejný jako pro double, ale skutečný rozsah pro daný sloupec decimal nebo numeric může být omezen přesností a měřítkem pro daný sloupec. když je tomuto sloupci přiřazena hodnota s více číslicemi po desetinná tečka, než je povoleno určeným měřítkem, je hodnota zaokrouhlena na toto měřítko. když je sloupci decimal nebo numeric přiřazena hodnota, jejíž velikost přesahuje rozsah implikovaný specifikovanou (nebo výchozí) přesností a měřítkem, mysql ukládá hodnotu představující odpovídající koncový bod tohoto rozsahu.</p> </blockquote><p>musíte se přizpůsobit větší přesnosti a/nebo měřítku.</p><p>zde je příklad, proč</p><p>tuto uloženou proceduru jsem napsal pomocí vašich specifikací pro decmial a numeric.</p><pre><code>delimiter $$ drop procedure if exists `test`.`numtest` $$ create procedure `test`.`numtest` (num1 numeric(7,2), num2 numeric(7,2)) begin declare float\_one,float\_two,my\_result numeric(7,2); declare f1,f2 double(7,2); set f1 = num1; set f2 = num2; set float\_one = num1; set float\_two = num2; select f1 / f2; select float\_one / float\_two; select convert(float\_one / float\_two,decimal(7,2)); set my\_result = convert(float\_one / float\_two,decimal(7,2)); select my\_result; end $$ delimiter ; </code></pre><p>pro tento test jsem použil dvě hodnoty: 290,0 a 14,5.</p><p>před voláním uložené procedury numtest jsem vypočítal ručně 290,0/14,5</p><pre><code>mysql&gt; select 290.0 / 14.5; ++ | 290.0 / 14.5 | ++ | 20.00000 | ++ 1 row in set (0.00 sec) </code></pre><p>každé číslo jsem rozdělil na 100, 10000 a 1000000 a zkusil to znovu</p><pre><code>mysql&gt; select 2.9 / .145; ++ | 2.9 / .145 | ++ | 20.00000 | ++ 1 row in set (0.00 sec) mysql&gt; select .029 / .00145; ++ | .029 / .00145 | ++ | 20.0000000 | ++ 1 row in set (0.00 sec) mysql&gt; select .00029 / .0000145; ++ | .00029 / .0000145 | ++ | 20.000000000 | ++ 1 row in set (0.00 sec) </code></pre><p>zatím je vše dobré !!! nyní pro uloženou proceduru.</p><pre><code>mysql&gt; call numtest(290.0,14.5); ++ | f1 / f2 | ++ | 20.000000 | ++ 1 row in set (0.00 sec) ++ | float\_one / float\_two | ++ | 20.000000 | ++ 1 row in set (0.00 sec) ++ | convert(float\_one / float\_two,decimal(7,2)) | ++ | 20.00 | ++ 1 row in set (0.00 sec) ++ | my\_result | ++ | 20.00 | ++ 1 row in set (0.00 sec) query ok, 0 rows affected (0.00 sec) </code></pre><p>takže moje orignální dvě čísla fungují dobře. rozdělme je 100 a zkuste to znovu.</p><pre><code>mysql&gt; call numtest(2.9,0.145); ++ | f1 / f2 | ++ | 19.333333 | ++ 1 row in set (0.00 sec) ++ | float\_one / float\_two | ++ | 19.333333 | ++ 1 row in set (0.00 sec) ++ | convert(float\_one / float\_two,decimal(7,2)) | ++ | 19.33 | ++ 1 row in set (0.00 sec) ++ | my\_result | ++ | 19.33 | ++ 1 row in set (0.00 sec) query ok, 0 rows affected, 1 warning (0.00 sec) mysql&gt; show warnings; ++++ | level | code | message | ++++ | note | 1265 | data truncated for column 'num2' at row 2 | ++++ 1 row in set (0.00 sec) </code></pre><p>počkejte, ztratili jsme určitou přesnost. co se stalo ??? jak se to stalo ??? musíte pojmout více desetinných míst (&gt; 2)</p><p><strong> aktualizace 2011-07-25 17:37 edt </strong></p><p>v uložené proceduře jsem nahradil (7,2) (10,7) a vrátil jsem se do správné přesnosti</p><pre><code>mysql&gt; call numtest(2.9,0.145); ++ | f1 / f2 | ++ | 20.00000000000 | ++ 1 row in set (0.00 sec) ++ | float\_one / float\_two | ++ | 20.00000000000 | ++ 1 row in set (0.01 sec) ++ | convert(float\_one / float\_two,decimal(10,7)) | ++ | 20.0000000 | ++ 1 row in set (0.03 sec) ++ | my\_result | ++ | 20.0000000 | ++ 1 row in set (0.05 sec) query ok, 0 rows affected (0.06 sec) mysql&gt; </code></pre> <p>i když si myslím, že jste sloupec již vytvořili, v této odpovědi předpokládám, že tento sloupec dosud neexistuje. imo, jedinečný povinný sloupec by měl být přidán <em> nikdy</em> bez plánování, jak naplnit existující řádky první. proto poskytnu metody, jak toho dosáhnout, počínaje nulou.</p><hr><p>jak to uděláte, záleží na tom, co se podílí na naplnění hodnot.</p><p>po použití libovolné metody přidejte do sloupce jedinečné omezení, abyste zajistili integritu dat. u metod 1 a 2 to lze provést v rámci jednoho příkazu nebo v rámci uživatelské transakce (není zobrazeno) a mělo by být provedeno v rámci uživatelské transakce v metodě 3.</p><p>pravděpodobně existuje několik dalších nejasných způsobů, jak to udělat, ale myslím, že jsem se zabýval nejběžnějšími.</p><hr><p><strong> metoda 1: přidejte sloupec identity </strong></p><pre><code>alter table mytable add mycolumn int identity(1, 2) not null </code></pre><p>tím se naplní všechny řádky v tabulce celočíselnými hodnotami začínajícími počátečními hodnotami (1), zvyšujícími se o přírůstkovou hodnotu (2) pro každý řádek. věřím, že pořadí, ve kterém jsou hodnoty naplněny, není definováno (pokud musíte určit objednávku, použijte metodu 3).</p><hr><p><strong> metoda 2: vyplnění pomocí výchozího omezení </strong></p><pre><code>alter table mytable add mycolumn uniqueidentifier not null constraint df\_mytable\_mycolumn default (newsequentialid()) </code></pre><p>to provede atomicky tři věci: 1. přidejte sloupec, který nepovoluje hodnoty <code>null</code>; 2. vytvořte výchozí omezení pro sloupec; 3. vyplňte každý řádek v tabulce pomocí výchozího omezení.</p><p>i když tento příklad používá sloupec <code>uniqueidentifier</code>, funguje stejně dobře s jakýmkoli typem dat a výchozím omezením.</p><hr><p><strong> metoda 3: vyplnění pomocí příkazu update </strong></p><p>tento případ by nastal, když například existuje hodnota z jiné části aplikace, kterou je třeba přidat do tabulky, nebo je třeba zadat přesnou objednávku pro jedinečné hodnoty.</p><pre><code>begin transaction alter table mytable add mycolumn int null update mytable set mycolumn = ... alter table mytable alter column mycolumn int not null commit transaction </code></pre><hr><p><strong> metoda 4: vyplnění pomocí objektu sequence </strong></p><p>pro sql server 2012 můžete naplnit sloupec pomocí hodnot generovaných objektem <code>sequence</code> - s tím jsem ještě nepracoval, takže se budu odkazovat na <a href="http://msdn.microsoft.com/en-us/library/ff878058.aspx">článek msdn</a> pro úplnost.</p> Často toto je provedeno pomocí [„Data Driven odběry“](https://msdn.microsoft.com/en-us/library/ms169673.aspx) , ale tato funkce je k dispozici pouze v některých SQL vydáních: Enterprise a Business Intelligence, ale ne v normě.


Takže existuje celá řada kreativních řešení. Ale nemám rád žádné z nich, a všechny vyžadují spravedlivý trochu práce mimo SSRS.


Mezi řešení, které jsem viděl, patří: Vytvoření odběr a potom zakázání nebo povolení SQL úlohu, kterou odešle předplatné (identifikovatelné podle GUID).


Vytvořte si .NET obálky exe zvládnout odeslání e-mailu. Je možné spustit dotaz nejprve zjistit, kolik se vrací řádky, a pak v případě potřeby generovat zprávu a zahrnout do e-mailu. <p>nedávno jsem měl něco podobného s tabulkou 3,5 milionu řádků. moje aktualizace by nikdy nedokončila. po mnoha experimentech a frustrace jsem konečně našel viníka. ukázalo se, že se jedná o indexy v aktualizované tabulce.</p><p>řešením bylo zrušit všechny indexy v aktualizované tabulce před spuštěním příkazu aktualizace. jakmile jsem to udělal, aktualizace skončila za pár minut. po dokončení aktualizace jsem znovu vytvořil indexy a vrátil se zpět do práce. pravděpodobně vám to v tuto chvíli nepomůže, ale možná někdo, kdo hledá odpovědi.</p><p>nechal bych indexy na stole, ze kterého stahujete data. ten nebude muset nadále aktualizovat žádné indexy a měl by pomoci s hledáním dat, která chcete aktualizovat. na pomalém notebooku to fungovalo dobře.</p> [`IGNORE_SPACE`](http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html#sqlmode_ignore_space)Režim umožňuje mezery mezi názvy funkcí a následující závorkách. Pokud je to povoleno, všechny názvy funkcí se stal vyhrazená slova, protože to stane se nemožné pro MySQL, zda voláte funkce nebo deklarovat (s použitím) identifikátor.


Proto, pokud je to povoleno, vaše `CREATE TABLE`selže a následující:



```
SELECT MD5 (some_column) FROM some_table

```

bude pracovat. Pokud `IGNORE_SPACE`je vypnuta, opak stane ( `CREATE TABLE`bude fungovat a především `SELECT`nebude, protože tam je mezera mezi názvu funkce a závorce).