Portál AbcLinuxu, 30. dubna 2025 12:36

Vychytávky v MySQL

27.7.2008 21:44 | Přečteno: 8530× | Výběrový blog | poslední úprava: 27.7.2008 21:54

Aneb co jsem všechno nevěděl a nikdy mi to nechybělo ;) ale je to zajímavý.. tak jsem se trošku přivzdělal a udělal jsem si následující výcuc. Třeba se někdo dozvíte taky něco novýho.
Pro pohodlnější počteníčko doporučuji formát PDF.

MySQL

Typy tabulek – Storage Engines

Tabulky nepodporující transakce (MyISAM) jsou rychlejší, zabírají méně místa na disku a potřebují méně paměti pro UPDATE.

MyISAM na data, z nichž se často vybírá pomocí SELECT a InnoDB na data, která se často mění.

CREATE TABLE t (i INT) ENGINE = INNODB;
ALTER TABLE t ENGINE = MYISAM;

Místo ENGINE se dříve používalo TYPE a tento termín je zachován z důvodu zpětné kompatibility.

Indexy

Zrychlení přístupu k datům.

Používat u všech sloupců, podle kterých se vyhledává, třídí nebo podle kterých se spojují tabulky.

Nepoužívat u tabulek, do kterých se převážně vkládá a jen výjimečně se z nich čte (např. logy).

Transakce – Transactions

Provedení několika činností dohromady jako jedné.

START TRANSACTION

Zahájí neboli odstartuje transakci. Veškeré příkazy zadané později jsou součástí transakce a navenek se tedy budou jevit jako jediný příkaz.

COMMIT

Aktuální transakce je potvrzena. Změny jsou zapsány do databáze.

ROLLBACK

Aktuální transakce je zamítnuta. Všechny provedené změny jsou zrušeny a databáze se vrátí do stavu, v němž byla před zahájením transakce.

START TRANSACTION;
UPDATE platy SET plat=plat+2000 WHERE plat < 15000;
UPDATE platy SET plat=plat*1.1;
COMMIT; 

Při použití InnoDB je transakce každý samostatný příkaz. Tzn. okolo transakce složené z jednoho příkazu není třeba psát START TRANSACTION a COMMIT.

SELECT * FROM cosi;

Předchozí příkaz provede ve skutečnosti toto:

START TRANSACTION; SELECT * FROM cosi; COMMIT;

Během provádění transakce všechny ostatní pokusy o práci nad stejnými daty čekají.

Cizí klíče – Foreign keys

V databázi máme následující tabulky:

Každý záznam psa má uvedené id majitele. Proto označíme v tabulce psi sloupec majitel jako cizí klíč, vztažený k sloupci osoba_id v tabulce osoby.

Když je poté přidán záznam pro psa, databázový engine bude vyžadovat, aby číslo v poli majitel nabývalo některé z existujících hodnot osoba_id tabulky osoby. Zároveň můžeme určit, zda se při smazání osoby smažou i záznamy všech vlastněných psů, nebo zda má pokus o smazání osoby vlastnící alespoň jednoho psa selhat.

Nastavení v phpMyAdmin pod odkazem Zobrazit relace na stránce struktury tabulky.

Tabulka musí být typu InnoDB.

ALTER TABLE psi
ADD FOREIGN KEY(majitel)
REFERENCES osoby(osoba_id)
ON UPDATE CASCADE	# změna id chovatele = změna i u všech jeho psů
				# RESTRICT – zabránění změně id chovatele
ON DELETE RESTRICT;	# chovatel nemůže být smazán pokud má nějaké psy
				# CASCADE – smazání chovatele = smazání i jeho psů
				# SET NULL – nastaví majitele na NULL

Pohledy – Views

Statické dotazy, s nimiž lze pracovat, jako by to byly tabulky (Pojmenované SELECTy). V MySQL od verze 5.0.

CREATE VIEW vwPracovnici AS SELECT * FROM pracovnici;
SELECT * FROM vwPracovnici;
CREATE VIEW vwPrumernyVek AS SELECT AVG(vek) AS prumer FROM pracovnici;
CREATE VIEW vwDobNeurc AS SELECT * FROM pracovnici WHERE zam_do IS NULL;
CREATE VIEW vwLidi AS SELECT prijmeni FROM pracovnici ORDER BY prijmeni; 

PhpMyAdmin zobrazí existující pohledy v seznamu tabulek.

Spojování tabulek

SELECT * FROM knihy, druhy;

Každý řádek s každým spojeny na jednom řádku – kartézský součin. Ke každé knize všechny druhy, které existují. My ale chceme knihu a její druh na jednom řádku. Vybereme tedy řádky kde druh z tabulky knihy se rovná id z tab. druhy.

SELECT * FROM knihy, druhy WHERE knihy.druh = druhy.id;
SELECT * FROM knihy INNER JOIN druhy ON knihy.druh = druhy.id [WHERE … ORDER BY …];

K výpisu i knih, které nemají nastavený druh (vypíše všechny z levé tabulky – podle LEFT/RIGHT – a k nim přiřadí z té druhé podle výrazu):

… FROM knihy LEFT JOIN druhy ON knihy.druh = druhy.id;
… FROM druhy RIGHT JOIN knihy ON knihy.druh = druhy.id;

2× totéž.

Poddotazy – Subqueries

SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
SELECT * FROM lidi WHERE mesto IN (SELECT mesto FROM mesta);

Uložené procedury – Stored procedures

Sada příkazů SQL, které jsou uložené na serveru a zkompilované pro rychlejší použití. V MySQL od verze 5.0.

CREATE PROCEDURE spVratRadky (od INT, do INT)
BEGIN
  SELECT * FROM software WHERE id BETWEEN od AND do;
END
CALL spVratRadky(10, 20) 

Při opakovaném spuštění bude následující příkaz cca o 25-30% rychlejší než prostá sada INSERTů.

create procedure sp_vlozradek(id INT, nazev VARCHAR(50))
BEGIN
  INSERT INTO software (id, nazev) VALUES (id, nazev);
END



CREATE PROCEDURE sp_vlozneboaktualizuj (radek INT, novynazev VARCHAR(50))
BEGIN
  IF EXISTS(SELECT * FROM software WHERE id = radek) THEN
    UPDATE software SET nazev = novynazev WHERE id = radek;
  ELSE
    INSERT INTO software (id, nazev) VALUES (radek, novynazev);
  END IF;
END



CREATE PROCEDURE spkalendar()
BEGIN
  DECLARE den DATE;
  SET den = CURDATE();
  CREATE TEMPORARY TABLE dny (datum DATE);
  WHILE den < (CURDATE() + INTERVAL 30 DAY) DO
    INSERT INTO dny (datum) VALUES (den);
    SET den = den + INTERVAL 1 DAY;
  END WHILE;
  SELECT datum FROM dny;
END

Nejprve je vytvořena prázdná dočasná tabulka a je zjištěno dnešní datum. Pak je ve smyčce WHILE přičteno postupně 30 dnů a výsledky jsou průběžně ukládány do dočasné tabulky. Nakonec je obsah této dočasné tabulky vrácen jako výsledek.

Trigger

Uložená procedura, která se spouští v souvislosti (před nebo po) s provedením nějakého akčního dotazu (UPDATE, DELETE,... , ne SELECT) na tabulce. Nic nevrací a nemá parametry.

CREATE TRIGGER trBackup
BEFORE DELETE
ON tabulka
FOR EACH ROW
BEGIN
  INSERT INTO tabulka_zaloha(id, jmeno, plat, cas_odstraneni, uzivatel)
  VALUES (old.id, old.jmeno, old.plat, NOW(), USER());
END; 

Možné akce: BEFORE/AFTER INSERT/UPDATE/DELETE

Pro každou akci nejvýše jeden trigger, každý trigger pouze pro jednu akci.

Triggery mají přístup k měněným datům přes virtuální tabulky old a new.

CREATE TRIGGER trMaxPlat
BEFORE INSERT
ON tabulka
FOR EACH ROW
BEGIN
  IF new.plat>30000 THEN /*něco, co akci zruší*/;
  END IF;
END;

Bohužel pro „něco, co akci zruší“ neexistuje žádný příkaz, je třeba vyvolat nějakou chybu.

Uživatelsky definované funkce – UDF

CREATE FUNCTION mesicslovy (mesic TINYINT)
RETURNS VARCHAR (9)
BEGIN
RETURN CASE mesic
  WHEN 1 THEN 'ledna'
  WHEN 2 THEN 'února'
  ...
  WHEN 12 THEN 'prosince'
END;
END

Zdroje

MySQL 5.0 Reference Manual

Seriál MySQL na Linuxsoft.cz

PHP triky

       

Hodnocení: 100 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

Přemek Vyhnal avatar 27.7.2008 21:46 Přemek Vyhnal | skóre: 24 | blog: Toto není blog! | Dobřichovice
Rozbalit Rozbalit vše Re: Vychytávky v MySQL
Odpovědět | Sbalit | Link | Blokovat | Admin
Příloha:
Zápisek s lepším formátováním v PDF v příloze.
NO RAPTORS!
Daniel Kvasnička ml. avatar 27.7.2008 22:05 Daniel Kvasnička ml. | skóre: 52 | blog: The Joys and Sorrows of Being an IT Freak | Ostrava
Rozbalit Rozbalit vše Re: Vychytávky v MySQL
Odpovědět | Sbalit | Link | Blokovat | Admin
Yep, foreign keys jsou super. Usetri to plno nudneho kodu v samotne aplikaci. To i ten fulltext ozelim.
FSF: “screw you for not wanting the stuff we produce”, People: “screw you for not producing the stuff we want."
29.7.2008 19:53 Messa | skóre: 39 | blog: Messa
Rozbalit Rozbalit vše Re: Vychytávky v MySQL
Škoda, že foreign keys nejdou deklarovat rovnou u deklarace sloupce v create table, např. "CREATE TABLE osoba (id INT PRIMARY KEY); CREATE TABLE pes (id INT PRIMARY KEY, majitel INT REFERENCES osoba);". V PostgreSQL to funguje, ale MySQL to nejen že neumí, ale ani se nijak netváří, že to neumí. Tak se taky nespalte :-)
default avatar 30.7.2008 10:32 default | skóre: 22 | Madrid
Rozbalit Rozbalit vše Re: Vychytávky v MySQL
Všechny databáze, které používám, toto umí, ale nepoužívám to. Důvod je jednoduchý: když máte dvě tabulky, které jsou na sobě závislé, nelze je takto vytvořit sekvenčně. Vždy se u jedné musí udělat dodatečný ALTER TABLE … ADD CONSTRAINT…. Takže pro jednoduchost a přehlednost dělám vše přes ALTER TABLE a žiju si spokojeně. I pro sestavování deployment skriptů a jejich správu je toto řešení pro mě lepší :-)
2.8.2008 19:54 kaja47 | blog:
Rozbalit Rozbalit vše Re: Vychytávky v MySQL
leda vypnot kontrolu závislosí na začítku skrtipu pomocí SET FOREIGN_KEY_CHECKS = 0; a na konci jí zase zapnout, to by pak mohlo jít.
29.7.2008 20:24 Kyosuke | skóre: 28 | blog: nalady_v_modre
Rozbalit Rozbalit vše Re: Vychytávky v MySQL
Zajímavé, jak jsou někteří lidé selektivní. :-) Stěžují si na to, že se nikdo nestará o Python psaný v Javě, ale o cizích klíčích, bez kterých podle doktora Codda databáze vůbec nemá nárok říkat si RDBMS, prohlásí jen to, že "jsou super a ušetří spoustu nudného kódu", a určitě by se neštítil používat ji i bez nich, jako by se nic nedělo. :-D
Luk avatar 29.7.2008 20:38 Luk | skóre: 47 | blog: Kacířské myšlenky | Kutná Hora
Rozbalit Rozbalit vše Re: Vychytávky v MySQL
No, někteří lidé se ani na úroveň cizích klíčů nedostanou - jako třeba tvůrce "databáze" popsané v části Kalvárie údržby kódu :-D
Šifrování je absolutní nutnost a pomáhá chránit před nekalými živly
Dalibor Smolík avatar 30.7.2008 09:35 Dalibor Smolík | skóre: 54 | blog: Postrehy_ze_zivota | 50°5'31.93"N,14°19'35.51"E
Rozbalit Rozbalit vše Re: Vychytávky v MySQL
Jo. Cizí klíče - občas se to hodí :-). Někdy potřebuji zrušit fakturu, která se skládá z tabulky pro společné údaje a z tabulky pro zboží, řešil jsem to skriptem PHP, který nejprve provede výmaz v tabulce pro zboží a pak v tabulce pro společné údaje, když jsem zjistil, že se to dá provést mnohem elegantněji ;-)
Rozdíly v řeči a ve zvyklostech neznamenají vůbec nic, budeme-li mít stejné cíle a otevřená srdce.
30.7.2008 11:51 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Vychytávky v MySQL
Tohle není ani tak záležitost foreign keys, ale spíš toho, že si napíšete proceduru nebo trigger nebo máte v jazyce vychytávky typu 'on delete cascade' (což vlastně v podstatě je zase jen trigger). Smysl foreign keys je v tom, že engine sám se stará o to, aby se vám v databázi z jakéhokoli důvodu (třeba chybně napsané klientské aplikace) neobjevily položky bez faktury.
Dalibor Smolík avatar 30.7.2008 13:18 Dalibor Smolík | skóre: 54 | blog: Postrehy_ze_zivota | 50°5'31.93"N,14°19'35.51"E
Rozbalit Rozbalit vše Re: Vychytávky v MySQL
Jasně, díky za osvětlení :-) - u mně se položky bez faktury nemohou vyskytnout, protože v tabulce fakturace - zboží je jedno pole s uvedením čísla faktury, stejné pole je i v tabulce pro společné údaje pro fakturu. Když v této tabulce pro společné údaje zruším fakturu, měly by zmizet automaticky všechny řádky s uvedením tohoto čísla faktury ve druhé tabulce. A to by foreign key mohl řešit (stejně tak asi i transakce) .. Jak jsem psal, mám to řešené pouze systémem příkazů ve skriptu PHP.
Rozdíly v řeči a ve zvyklostech neznamenají vůbec nic, budeme-li mít stejné cíle a otevřená srdce.
30.7.2008 13:25 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: Vychytávky v MySQL
práveže v db bez foreign keys, tak taký záznam (omylom) existovať môže. stačí jednoduchý update či chyba v skripte (v prípade php a mysql môže byť ten skript aj správny) :-)
30.7.2008 14:48 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Vychytávky v MySQL
Tohle řeší spíš ten trigger (nebo 'on delete cascade'). Smysl foreign key je hlavně v tom, že vám tam ty položky odkazující na neexistující fakturu nemohou vzniknout ani v případě, že se je tam úmyslně pokusíte vytvořit (pokud nebudete hodně důmyslný a ten constraint nevypnete). Tedy ani ne tak vy, ale hlavně chybně napsaná klientská aplikace. Na takové narušení konzistence dat v databázi se totiž může přijít až po delší době a pak už je často extrémně těžké (až nemožné) to dát dohromady.
29.7.2008 22:17 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Vychytávky v MySQL
Vždycky jsem si říkal, jaké jsem měl ohromné štěstí, že první databáze, kterou jsem potkal, nebyla MySQL. :-)
29.7.2008 22:38 Kyosuke | skóre: 28 | blog: nalady_v_modre
Rozbalit Rozbalit vše Re: Vychytávky v MySQL
Myslím, že u mě to byl Informix, ale ne ze strany uživatele. :-D Jako uživatel jsem kouknul na MySQL, ale po spatření textů typu "transakce nepotřebujeme, ale zato jsme brutálně rychlí, a vůbec, atomické updaty řádků většině lidí stačí a zbytek se ošetří v aplikaci" spojených s naprosto otřesným překladem jsem odhodil jak onu knihu, tak i MySQL a nakonec objevil Firebird 1.0.3 a knihu Pavla Císaře. :-) (A všechno završil tím, že jsem si sedl a popovídal s Jimem Starkeym u piva, když byl v Praze. :-))
29.7.2008 23:11 Ladicek | skóre: 28 | blog: variace | Havlíčkův brod
Rozbalit Rozbalit vše Re: Vychytávky v MySQL
"transakce nepotřebujeme, ale zato jsme brutálně rychlí, a vůbec, atomické updaty řádků většině lidí stačí a zbytek se ošetří v aplikaci"
Tu knihu psal někdo od eBaye? :-D
Ještě na tom nejsem tak špatně, abych četl Viewegha.
29.7.2008 23:23 Kyosuke | skóre: 28 | blog: nalady_v_modre
Rozbalit Rozbalit vše Re: Vychytávky v MySQL
Nějaký střelený Polák. ;-) Tohle to bylo. Tehdy jsem byl ještě mladej a blbej (dneska už jsem jenom blbej :-D), tak jsem nevěděl, že 1) kupovat překlady a 2) kupovat knihy typu "Naučte se X za Y dní" (případně až extrémy typu "Naučte se SAP R/3 za patnáct minut" :-D) je fakt spíš ruská ruleta než promyšlená koupě. Teď už kupuju jen hodnotnou literaturu. ;-)
29.7.2008 23:21 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
Rozbalit Rozbalit vše Re: Vychytávky v MySQL
foxpro a debefka s indexy na tebe! to by sis pak jinak vazil mysql! ;-]

btw. muj prvni db-stroj se kterym jsem valcil byl interbase... az se divim, co vsechno s tim slo pred deseti lety delat a co z toho uz jde i v mysql
Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
29.7.2008 23:25 Kyosuke | skóre: 28 | blog: nalady_v_modre
Rozbalit Rozbalit vše Re: Vychytávky v MySQL
Spíš tak před patnácti, ne? ;-) Nebo aspoň Interbase před deseti lety a Interbase před patnácti mi přišly historicky tak nějak skoro stejné, on se Borland nijak zvlášť ve vývoji nepřetrhl, aspoň pokud je mi známo.
29.7.2008 23:50 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
Rozbalit Rozbalit vše Re: Vychytávky v MySQL
no, tak to nedokazu posoudit, protoze pred patnacti lety jsem jeste mastil programy na osmibitech. ale pred deseti lety uz jsem mastil programy v delphi a s interbaskou.
Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
30.7.2008 01:44 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Vychytávky v MySQL

Nejen vývoj, ale i marketing… Skoro bych řekl, že se Interbase snažili nechat tiše upadnout v zapomnění a o kvalitě projektu svědčí fakt, že se jim to přes veškerou snahu nepodařilo. Teď sice zase nějaký vývoj probíhá, ale připadá mi, že je to spíš natruc Firebirdu než ze zájmu o produkt samotný.

Ale co čekat od firmy, která každých pár let změní název a ještě častěji strategii a vytrvale se snaží vrhat energii jakýmkoli směrem kromě toho, v čem se jim daří?

30.7.2008 01:36 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Vychytávky v MySQL
foxpro a debefka s indexy na tebe! to by sis pak jinak vazil mysql! ;-]

No, bereme-li to až takhle, tak první byla dBase III. Ale měl jsem na mysli spíš Interbase 6.0 beta.

interbase... az se divim, co vsechno s tim slo pred deseti lety delat a co z toho uz jde i v mysql

Ve skutečnosti je to ještě horší - spousta z těch věcí, které se v MySQL objevily s velkou slávou v posledních letech, byla v Interbase (která se tehdy ještě nejmenovala Interbase) před více než dvaceti lety…

30.7.2008 02:41 Kyosuke | skóre: 28 | blog: nalady_v_modre
Rozbalit Rozbalit vše Re: Vychytávky v MySQL

To by sedlo, Hot Backup v MySQL teprv bude (možná :-D), pokud vím, a v Interbase zaručeně fungoval za plného chodu už v roce 1988 ve verzi 3 nebo tak nějak. :-)

Což mi připomnělo i tohle - aneb co uměla (a kde byla nasazována) Interbase v době, kdy autoři MySQL teprv zkusmo lepili cizí SQL frontend na první vývojovou verzi vlastního ISAM backendu. Skoro mi přijde, že začátky obou systémů docela pěkně odrážejí celé jejich další směrování. Přičemž u Interbase na začátku nebyl čtyřicet let starý (a zastaralý) ISAM, ale v té době revoluční verzovací transakční engine, který pak spousta lidí sprostě (a špatně :-)) vobšlehla, včetně Oraclu ("nefíčury" Oraclu před rokem 1992 jsou kapitola sama pro sebe :-)), PostgreSQL a MS SQL Serveru 2005. (A ano, jsem Smug Firebird Weenie a ještě to drze přiznávám. :-D)

30.7.2008 11:23 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
Rozbalit Rozbalit vše Re: Vychytávky v MySQL
v dBase III+ jsem jeste neco delal na skole, ale bylo to silene, ale ve foxpro jsem delal skutecne programy... a byl to zazitek... nejvetsi sranda je, ze jeste dneska se daji na spouste mist najit programy napsane ve foxpro 2.x...
Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
default avatar 30.7.2008 10:42 default | skóre: 22 | Madrid
Rozbalit Rozbalit vše Re: Vychytávky v MySQL
Já si to říkám i teď :-D
27.7.2008 22:06 Robert Krátký | skóre: 94 | blog: Robertův bloček
Rozbalit Rozbalit vše Re: Vychytávky v MySQL
Odpovědět | Sbalit | Link | Blokovat | Admin
Šikovný zápisek, díky. K odkazům doplňuji:

Seriál: Tvorba databází v MySQL a Seriál: Správa databází v MySQL.
Luk avatar 27.7.2008 22:11 Luk | skóre: 47 | blog: Kacířské myšlenky | Kutná Hora
Rozbalit Rozbalit vše Re: Vychytávky v MySQL
Odpovědět | Sbalit | Link | Blokovat | Admin
Při použití InnoDB je transakce každý samostatný příkaz. Tzn. okolo transakce složené z jednoho příkazu není třeba psát START TRANSACTION a COMMIT.
Tohle platí jen v případě, že je zapnutý autocommit (výchozí stav). Lze ovšem vypnout (SET AUTOCOMMIT=0) a pak se musí každá transakce zahájit a ukončit. Pokud se při zapnutém autocommitu zavolá START TRANSACTION, autocommit se do dokončení této transakce vypne (pak se zase sám zapne).
Během provádění transakce všechny ostatní pokusy o práci nad stejnými daty čekají.
Opět platí jen částečně. Do jaké míry bude přístup k datům zamykán, záleží na nastavení izolace transakcí.
Šifrování je absolutní nutnost a pomáhá chránit před nekalými živly
29.7.2008 09:58 Robo
Rozbalit Rozbalit vše Re: Vychytávky v MySQL
S MySQL som moc casto nerobil. Tak mam dve otazky:
1. Ak defaultne zadam nejaky UPDATE statement, rovno ho commitne?
2. Ak je autocommit vypnuty a zadam UPDATE statement, hodi chybu, ze chyba zaciatok transakcie alebo transakciu zacne automaticky (ako napr. Oracle) a potom ju staci commitnut?

este jedna otazka, ak jeden user update-uje tabulku, lockne sa cela tabulka alebo iba dane riadky?
29.7.2008 10:35 Kyosuke | skóre: 28 | blog: nalady_v_modre
Rozbalit Rozbalit vše Re: Vychytávky v MySQL
K tomu poslednímu poslední: U MyISAM jedině celá, u BDB enginu stránky, u InnoDB jen dané řádky, jestli se nepletu. A optimistické zamykání asi v nedohlednu. :-D
Luk avatar 29.7.2008 10:35 Luk | skóre: 47 | blog: Kacířské myšlenky | Kutná Hora
Rozbalit Rozbalit vše Re: Vychytávky v MySQL
1. Ak defaultne zadam nejaky UPDATE statement, rovno ho commitne?
Ano. Možná to z té věty nebylo dostatečně zřejmé ;-)
2. Ak je autocommit vypnuty a zadam UPDATE statement, hodi chybu, ze chyba zaciatok transakcie alebo transakciu zacne automaticky (ako napr. Oracle) a potom ju staci commitnut?
Za b) je správně - začne transakci automaticky. Při použití je ale velkou chybou na to spoléhat, velmi snadno to totiž vede k tomu, že se pak člověk diví, proč mu něco nefunguje (když neví, jestli jestli je zrovna autocommit zapnutý). Když se pracuje s transakcemi, vždy je dobré používat START TRANSACTION, ať je autocommit zapnutý nebo ne.
este jedna otazka, ak jeden user update-uje tabulku, lockne sa cela tabulka alebo iba dane riadky?
Zamykání závisí na úrovni izolace (např. při READ UNCOMMITED se pro čtení nezamyká vůbec - ostatní uživatelé mohou tedy dostat data, která následně nebudou potvrzena). Celá tabulka se ale nezamyká nikdy, pokud se nezamkne explicitně. Explicitní zamykání celé tabulky ale není kompatibilní s transakcemi. Pokud se dá LOCK TABLES, automaticky to způsobí COMMIT. Naopak příkaz START TRANSACTION automaticky vyvolá UNLOCK TABLES.
Šifrování je absolutní nutnost a pomáhá chránit před nekalými živly
Luk avatar 29.7.2008 10:37 Luk | skóre: 47 | blog: Kacířské myšlenky | Kutná Hora
Rozbalit Rozbalit vše Re: Vychytávky v MySQL
To o tom zamykání vztahuji samozřejmě k InnoDB, pro ostatní enginy (bez transakcí) to už popsal Kyosuke (a asi správně).
Šifrování je absolutní nutnost a pomáhá chránit před nekalými živly
hikikomori82 avatar 27.7.2008 22:24 hikikomori82 | skóre: 18 | blog: foobar | Košice
Rozbalit Rozbalit vše Re: Vychytávky v MySQL
Odpovědět | Sbalit | Link | Blokovat | Admin
To je sice pekne, ale ked ide o nasadenie v realnom prostredi, treba zrazu riesit rozdielne verzie db, prava, uzivatelov a podobne sracky, prave dnes som musel jeden before update trigger zrusit a do kodu rucne doplnit co ten trigger robil lebo to neslo, myslim ze sa do buducna tomuto vyhnem a necham to KISS (keep it simple, stupid).
Slobodný font na technické kreslenie
27.7.2008 22:30 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
Rozbalit Rozbalit vše Re: Vychytávky v MySQL
Odpovědět | Sbalit | Link | Blokovat | Admin
co jsem všechno nevěděl a nikdy mi to nechybělo
a to jste predtim mysql i nejak pouzival?
Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
Přemek Vyhnal avatar 27.7.2008 23:08 Přemek Vyhnal | skóre: 24 | blog: Toto není blog! | Dobřichovice
Rozbalit Rozbalit vše Re: Vychytávky v MySQL
a to jste predtim mysql i nejak pouzival?
ano, spokojeně ;)
NO RAPTORS!
28.7.2008 00:16 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
Rozbalit Rozbalit vše Re: Vychytávky v MySQL
:-]] zrejme slusny oddil...
Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
xkucf03 avatar 28.7.2008 22:50 xkucf03 | skóre: 49 | blog: xkucf03
Rozbalit Rozbalit vše Re: Vychytávky v MySQL
Taky jsem takhle začínal - asi v patnácti jsem vzal MySQL a v phpMyAdminovi si naklikal nějaké ty tabulky, SQL (tehdy jen selekty) jsem se učil za chodu, z DB jsem prakticky nic nevyužíval, všechno bylo v aplikační vrstvě. A jak pěkně mi to fungovalo :-)

Dneska si bez cizích klíčů, transakcí a spojování tabulek nedokážu práci s (relační) databází představit.

Výcuc je celkem fajn, třeba někomu pomůže, aby nezačínal tak blbě jako já, takže díky za něj.
Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
27.7.2008 23:21 JohnnyDoe | skóre: 11 | blog: _
Rozbalit Rozbalit vše Re: Vychytávky v MySQL
Odpovědět | Sbalit | Link | Blokovat | Admin
InnoDB – transakce, cizí klíče, neumí fulltext (a nebo už ano?)
Je zde někdo znalý, kdo ví, jaký je současný/budoucí stav fulltextu v InnoDB? Nebo pořád platí ten trik s paralelním vytvářením dvou tabulek se stejnými daty, ale s jednou InnoDB a na fultext s druhou MyISAM?
Luk avatar 28.7.2008 00:03 Luk | skóre: 47 | blog: Kacířské myšlenky | Kutná Hora
Rozbalit Rozbalit vše Re: Vychytávky v MySQL
Je zde někdo znalý, kdo ví, jaký je současný/budoucí stav fulltextu v InnoDB?
Vypadá to špatně. Už to tam hnije skoro 3 roky a zatím nikdo nedal na vědomí, že by se to pohnulo kupředu. Ale to není ojedinělé - dlouho tam zahnívají i velmi záludné a ošklivé chyby (jako třeba tato, která zřejmě způsobuje poškození haldy - u verze 4 měla za následek zátuh serveru, verze 5 se při jejím výskytu aspoň sama restartuje).
Nebo pořád platí ten trik s paralelním vytvářením dvou tabulek se stejnými daty, ale s jednou InnoDB a na fultext s druhou MyISAM?
Ano.
Šifrování je absolutní nutnost a pomáhá chránit před nekalými živly
27.7.2008 23:30 jenda
Rozbalit Rozbalit vše Re: Vychytávky v MySQL
Odpovědět | Sbalit | Link | Blokovat | Admin
v budoucnu, az bude zpracovani dat neco obycejneho jako strojni soucasti, prvky obvodu nebo technicka zarizeni budov, budou studenti konfrontovani s technickymi a historickymi otazkami z oblasti zpracovani informaci:

- vyjmenujte situace v provozu zpracovani dat, kdy jsou tzv. cizi klice prekazkou

- vyjmenujte situace, ve kterych je povoleno pouziti cizich klicu pres jejich nesporne nevyhody

- z historie je znama profese 'administrator rel. db. systemu'. Vyjmenujte nektere z tehdejsich nesmyslnych pracovnich cinnosti teto drivejsi profese a zduvodnete, co vedlo k jejimu zaniku.

- predstavte si, ze by jste meli v minulosti sabotovat zavedeni nejakeho informacniho systemu. Zduvodnete, ktera z uvedenych metod by byla tenkrat vyhodnejsi: extenzivni vyuziti cizich klicu se soucasnym loadem dat z tabulkoveho procesoru nebo vyuziti komplikovanch union-selectu s max. isolation-level

- vysvetlete, proc v drivejsich dobach se vyskytovaly na internetu stamiliony dotazu ohledne chyb v select-statementech i kdyz tyto jsa odvozeny z lidske reci by mely byt pro uzivatele 'prirozene' pouzitelne.

- jmenujte rok prvni pgsql-mysql valky a vyjmenujte hlavni argumenty myisam frakce.
pavlix avatar 27.7.2008 23:53 pavlix | skóre: 54 | blog: pavlix
Rozbalit Rozbalit vše Re: Vychytávky v MySQL
Odpovědět | Sbalit | Link | Blokovat | Admin
Aneb... jak se z MySQL snaží udělat velkou databázi a implementovat alespoň částečně věci, které jiné umějí už dávno (včetně třeba opensource PostgreSQL).
Já už tu vlastně ani nejsem. Abclinuxu umřelo.
Luk avatar 28.7.2008 00:08 Luk | skóre: 47 | blog: Kacířské myšlenky | Kutná Hora
Rozbalit Rozbalit vše Re: Vychytávky v MySQL
Ovšem původnímu tvůrci se to nelíbí a udělal odlehčený fork ;-)
Šifrování je absolutní nutnost a pomáhá chránit před nekalými živly
28.7.2008 04:54 Kyosuke | skóre: 28 | blog: nalady_v_modre
Rozbalit Rozbalit vše Re: Vychytávky v MySQL
Já nevím, ale proč "velkou databázi"? Tyhlety věci už před dvaceti lety uměly i malé databáze. A to i včetně takových fičurek, jako je zabalení změn schématu databáze do transakcí a líných aktualizací fyzických řádků. (MySQL prý udělá novou kopii tabulky a dokud ji celou nepředělá, tak se do toho nedá zapisovat. Plus nějaké to místo na disku navíc, že? :-) Ale kdo ví, když se kucí švédský sluníčkový budou hodně snažit, tak se do roku 1985 třeba brzy dostanou taky... :-))
pavlix avatar 29.7.2008 01:20 pavlix | skóre: 54 | blog: pavlix
Rozbalit Rozbalit vše Re: Vychytávky v MySQL
Třeba jo :). Ale nedej bože, aby pak z PHP udělali programovací jazyk.
Já už tu vlastně ani nejsem. Abclinuxu umřelo.
default avatar 30.7.2008 10:41 default | skóre: 22 | Madrid
Rozbalit Rozbalit vše Re: Vychytávky v MySQL
Odpovědět | Sbalit | Link | Blokovat | Admin
SELECT * FROM lidi WHERE mesto IN (SELECT mesto FROM mesta)
A funguje už
SELECT
    *
FROM
    table1 t1 INNER JOIN (SELECT
            tx.col1, tx.col2
        FROM
            table2 tx) t2
    ON (t1.colx = t2.col2)
/
nebo se ještě pořád musí jezdit do serverovny mačkat tlačítko Reset?
Luk avatar 30.7.2008 11:16 Luk | skóre: 47 | blog: Kacířské myšlenky | Kutná Hora
Rozbalit Rozbalit vše Re: Vychytávky v MySQL
nebo se ještě pořád musí jezdit do serverovny mačkat tlačítko Reset?
Každopádně u verze 5 platí, že když se něco podělá, tak se to samo restartuje - narozdíl od verze 4, která se sekla (např. kvůli této chybě).
Šifrování je absolutní nutnost a pomáhá chránit před nekalými živly

Založit nové vláknoNahoru

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.