postgresql multi-sloupec jedinečné omezení a hodnoty null
<p>mám tabulku jako je tato:</p><pre><code>create table my\_table ( id int8 not null, id\_a int8 not null, id\_b int8 not null, id\_c int8 null, constraint pk\_my\_table primary key (id), constraint u\_constrainte unique (id\_a, id\_b, id\_c) ); </code></pre><p>a já chci <code>(id\_a, id\_b, id\_c)</code> být odlišný v každé situaci. následující dvě přílohy musí tedy vést k chybě:</p><pre><code>insert into my\_table values (1, 1, 2, null); insert into my\_table values (2, 1, 2, null); </code></pre><p>ale nechová se tak, jak se očekávalo, protože podle dokumentace nejsou dvě hodnoty <code>null</code> vzájemně porovnávány, takže obě vložky procházejí bez chyby.</p><p>jak mohu zaručit své jedinečné omezení, i když <code>id\_c</code> může být v tomto případě <code>null</code>? skutečná otázka zní: mohu zaručit tento druh jedinečnosti v „čistém sql“ nebo musím implementovat na vyšší úrovni (v mém případě java)?</p>
<p>můžete to udělat v <strong> čistém sql </strong>. vytvořte <strong> <a href="https://www.postgresql.org/docs/current/indexes-partial.html">částečný jedinečný index</a> </strong> <em> navíc </em> k tomu, který máte:</p><pre><code>create unique index ab\_c\_null\_idx on my\_table (id\_a, id\_b) where id\_c is null; </code></pre><p>tímto způsobem můžete zadat <code>(a, b, c)</code> v tabulce:</p><pre><code>(1, 2, 1) (1, 2, 2) (1, 2, null) </code></pre><p>ale nic z toho podruhé.</p><p>nebo použijte <strong> dva </strong> částečné <code>unique</code> indexy a žádný úplný index (nebo omezení). nejlepší řešení závisí na detailech vašich požadavků. porovnat:</p><ul> <li> <a href="https://stackoverflow.com/a/8289253/939860">vytvořte jedinečné omezení s nulovými sloupci</a> </li> </ul><p>i když je to elegantní a účinný pro jeden sloupec s nulovatelným nulovým číslem v indexu <code>unique</code>, rychle se vymkne z ruky pro další. diskutujte o tom - a jak používat upsert s částečnými indexy:</p><ul> <li> <a href="https://dba.stackexchange.com/q/151431/3684">postgresql upsert problém s hodnotami null</a> </li> </ul><h3>kromě</h3><p>žádné použití pro <a href="https://www.postgresql.org/docs/current/sql-syntax-lexical.html#sql-syntax-identifiers">smíšené případy bez dvojitých uvozovek</a> v postgresql.</p><p>můžete <em> </em> považovat <a href="https://www.postgresql.org/docs/current/datatype-numeric.html#datatype-serial"><code>serial</code> sloupec</a> za primární klíč nebo <a href="https://www.postgresql.org/docs/current/sql-createtable.html"><code>identity</code> sloupec</a> in postgres 10 nebo novější. příbuzný:</p><ul> <li> <a href="https://stackoverflow.com/questions/9875223/auto-increment-table-column/9875517#9875517">sloupec tabulky automatických přírůstků</a> </li> </ul><p>tak:</p><pre><code>create table my\_table ( my\_table\_id bigint generated by default as identity primary key -- for pg 10+ -- my\_table\_id bigserial primary key -- for pg 9.6 or older , id\_a int8 not null , id\_b int8 not null , id\_c int8 , constraint u\_constraint unique (id\_a, id\_b, id\_c) ); </code></pre><p>pokud neočekáváte více než 2 miliardy řádků (&gt; 2147483647) po celou dobu životnosti vaší tabulky (včetně řádků s odpadem a odstraněním), zvažte místo <code>integer</code> (8 bajtů) místo <code>bigint</code> (8 bajtů).</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). Neexistuje žádný dobrý důvod vzdát zjevné indexy (FKS, atd), při vytváření tabulky. To se nikdy výrazně ovlivnit výkon na to, aby nepotřebné indexy malých tabulek, a to je dobré, aby se první řez, když je vaše mysl v souvislosti s návrhem schématu. Také některé indexy slouží k zabránění duplicity, které mohou být užitečné bez ohledu na velikost tabulky.


Myslím, že správná odpověď na vaši otázku je, že počet záznamů v tabulce by měl mít nic společného s tím, když se vytvořit indexy. <p>pravděpodobně se dostáváte do radostí mysql myisam engine ...</p><p>v rámci mysql (nebo phpmyadmin) použijte příkazy repair table xyz znovu, opakovaně, na každé z vašich tabulek (nebo spíše tabulek souvisejících s vašimi podmínkami, protože to jsou ty, které znějí zkaženě), aby se zjistilo, zda to nic nevyřeší.</p><p>pokud selžou, existuje několik zdokumentovaných řešení:</p><p> <a href="http://www.google.com/search?q=recover+a+corrupt+mysql+database">http://www.google.com/search?q=recover+a+corrupt+mysql+database</a> </p><p>jakmile jsou věci obnoveny, spusťte příkazy optimalizovat tabulku xyz na každé tabulce a poté změňte motor databáze a každou tabulku, aby byla použita innodb. innodb poněkud neuspořádá katalog (zejména pokud upustíte databázi nebo velké tabulky), ale - pokud je kompatibilní s acid - je to o dost méně náchylné k chybám než myisam.</p> Hmm, zni to dost zmatene. Nechapu, proc by tabulka z Wordu nesla zkopcit?! A ta druha tabulka v Excelu je zase co? Tak je v Excelu nebo ve Wordu? Neni to kontingencni tabulka? Zkuste pomalu a srozumitelne popsat o co presne jde a uvedomte si, ze jste jedina kdo vi vsechny informace a musite je predat. Tvůj kód nehodlám číst, takže jen obecně. Na začátku před tím než budeš data řadit, tak si udělej jejich kopii. Pak si data seřaď a máš co jsi chtěl. V té kopii máš původní neseřazená data v původním pořadí. Aby bylo možné vidět všechny klíče (které nejsou skryté), že blok šifrovaným datům zašifrovaná, aby - včetně sami - můžete jednoduše vytvořit svůj tajný-keyring dispozici přes něco takového:



```
gpg --no-default-keyring --secret-keyring /dev/null -a --list-only

```

Který říká gpg nepoužívat žádné výchozí klíčenky (-no-default-přívěšek na klíče), je-li zadán neplatný / chybějící klíčenku, a pak jde o to určit neplatné / chybějící tajné klíčenku (--secret-klíčenka / dev / null ) Udělej si dvě tabulky. V jedné budeš mít kompletní info a ve druhé jen požadovaný výstup. Pokud budeš mít vše ve stejném formátu a seřazené, je to už snadné. <p>můžete vytvořit funkci se vzorem <code>shouldserialize{propertyname}</code>, který řekne xmlserializer, pokud má člen serializovat nebo ne.</p><p>pokud se například vlastnost třídy nazývá <code>mynullableint</code>, můžete mít</p><pre><code>public bool shouldserializemynullableint() { return mynullableint.hasvalue; } </code></pre><p>zde je úplný vzorek</p><pre><code>public class person { public string name {get;set;} public int? age {get;set;} public bool shouldserializeage() { return age.hasvalue; } } </code></pre><p>serializován s následujícím kódem</p><pre><code>person theperson = new person(){name="chris"}; xmlserializer xs = new xmlserializer(typeof(person)); stringwriter sw = new stringwriter(); xs.serialize(sw, theperson); </code></pre><p>výsledky v následujícím xml - všimněte si, že neexistuje žádný věk</p><pre><code>&lt;person xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:xsd="http://www.w3.org/2001/xmlschema"&gt; &lt;name&gt;chris&lt;/name&gt; &lt;/person&gt; </code></pre> Č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. hezký den,

v tomto případě je příčinou nulové hodnoty nastavení vlastního formátu, ve kterém jsou do elementu price\_vat mapovány 2 elementy (price a start\_price\_vat). doporučuji tedy použít pouze element price a v případě, že má být použita hodnota elementu start\_price\_vat vytvořit produktový výběr…