Autor Zpráva
Enko
Profil
Ahoj,
potřebuji si vytvořit v MySQL tabulce nad dvěma sloupci zároveň vytvořit unikátní klíč. První sloupec je klasický varchar a druhý je typu timestamp. Tento klíč chci nastavit tak, aby byl byl sloupec s Timestamp zaokrouhlený na 2 minuty zároveň s druhým sloupcem varchar. Je toto možné přímo v MySQL? Nikde jsem to nemohl najít.
Mohl bych si to ošetřit v PHP, ale bylo by to zbytečné pokládání dalších dotazů do databáze.

Děkuji za každou radu.
Martin2
Profil *
To není dobrý nápad. Vymýšlíš znovu něco, co už existuje – číselný index typu PRIMARY s automatickou inkrementací.
Keeehi
Profil
Martin2:
Blbost to být nemusí. Složené klíče jsou naprosto legitimní v databázovém návrhu.

Enko:
UNIQUE přes dva a více sloupců samozřejmě jde. Co se týče toho zaokrouhlování, tak s tím jsem se nesetkal. Databáze jsou primárně určené pro uchovávání dat. Podle toho jsou taky vytvořené a nějaké aritmetické divočiny jim nejsou moc vlastní. Pokud zaokrouhlování chceš řešit v databázi, tak bych si asi napsal trigger, který ten timestamp před uložením zaokrouhlí.
Enko
Profil
Keeehi:
Děkuji za odpověď. Vyřešil jsem nakonec jinak. A to pomocí jednoho dotazu do databáze navíc s podmínkou
AND TIMESTAMPDIFF(MINUTE, timestamp, NOW()) < 2
Martin2
Profil *
Keeehi:
Blbost to být nemusí. Složené klíče jsou naprosto legitimní v databázovém návrhu.
Máš pravdu, nemusí. Enko ovšem evidentně není natolik zkušený, aby je měl zvolit.
Navíc, používat jako unikátní identifikátor čas zaokrouhlený na minuty, tak to bych se teda rád podíval, v jaké situaci by se taková prasečina směla objevit.
MartinP
Profil *
Martin2:
Navíc, používat jako unikátní identifikátor čas zaokrouhlený na minuty, tak to bych se teda rád podíval, v jaké situaci by se taková prasečina směla objevit.
Tak třeba chce zajistit, aby stejný uživatel nemohl za minutu vložit více příspěvků.
Enko
Profil
MartinP:
Tak třeba chce zajistit, aby stejný uživatel nemohl za minutu vložit více příspěvků.
Přesně tak. Chci zajistit nevkládání duplicitních záznamů.

Martin2:
Máš pravdu, nemusí. Enko ovšem evidentně není natolik zkušený, aby je měl zvolit.
Složené klíče samozřejmě používat umím. Můj dotaz byl, zda je možné použít i timestamp se zaokrouhlením na minuty. Ulehčilo by to totiž zbytečnému pokládání dotazů do databáze navíc.

Navíc, používat jako unikátní identifikátor čas zaokrouhlený na minuty, tak to bych se teda rád podíval, v jaké situaci by se taková prasečina směla objevit.
Odpověď viz výše. To že tebe nenapadá taková situace, neznamená, že neexistuje.

Každopádně děkuji všem za jejich čas.
Keeehi
Profil
To co chceš je vlastně podmíněný insert. Některé databáze umějí INSERT ... IF ... ale MySQL klasický ne. Takže se to musí obcházet. Jeden přístup je vytvoření dočasné tabulky ale ten se mi líbí méně než ten druhý, i když taky ošklivý. Ten je založen na INSERT ... SELECT ... což MySQL zvládá a v části se selectem už podmínka použít jde.

INSERT INTO tabulka (sloupec1, sloupec2)
SELECT 'data sloupce 1', 'data sloupce 2' FROM (SELECT 1) AS DummyTable WHERE NOT EXISTS (SELECT 1 FROM tabulka t 
WHERE t.sloupec1 = 'data sloupce 1'  AND NOW() - UNIX_TIMESTAMP(sloupec2) < 120);

Ovšem je to tak ošklivé, že bych raději použil 2 dotazy.
Enko
Profil
Keeehi:
Děkuji za inspiraci.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: