Google Chrome 136 byl prohlášen za stabilní. Nejnovější stabilní verze 136.0.7103.59 přináší řadu novinek z hlediska uživatelů i vývojářů. Podrobný přehled v poznámkách k vydání. Opraveno bylo 8 bezpečnostních chyb. Vylepšeny byly také nástroje pro vývojáře.
Homebrew (Wikipedie), správce balíčků pro macOS a od verze 2.0.0 také pro Linux, byl vydán ve verzi 4.5.0. Na stránce Homebrew Formulae lze procházet seznamem balíčků. K dispozici jsou také různé statistiky.
Byl vydán Mozilla Firefox 138.0. Přehled novinek v poznámkách k vydání a poznámkách k vydání pro vývojáře. Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 138 je již k dispozici také na Flathubu a Snapcraftu.
Šestnáctý ročník ne-konference jOpenSpace se koná 3. – 5. října 2025 v Hotelu Antoň v Telči. Pro účast je potřeba vyplnit registrační formulář. Ne-konference neznamená, že se organizátorům nechce připravovat program, ale naopak dává prostor všem pozvaným, aby si program sami složili z toho nejzajímavějšího, čím se v poslední době zabývají nebo co je oslovilo. Obsah, který vytvářejí všichni účastníci, se skládá z desetiminutových
… více »Richard Stallman přednáší ve středu 7. května od 16:30 na Technické univerzitě v Liberci o vlivu technologií na svobodu. Přednáška je určená jak odborné tak laické veřejnosti.
Jean-Baptiste Mardelle se v příspěvku na blogu rozepsal o novinkám v nejnovější verzi 25.04.0 editoru videa Kdenlive (Wikipedie). Ke stažení také na Flathubu.
TmuxAI (GitHub) je AI asistent pro práci v terminálu. Vyžaduje účet na OpenRouter.
Byla vydána nová verze R14.1.4 desktopového prostředí Trinity Desktop Environment (TDE, fork KDE 3.5, Wikipedie). Přehled novinek i s náhledy v poznámkách k vydání. Podrobný přehled v Changelogu.
Bylo vydáno OpenBSD 7.7. Opět bez písničky.
MyISAM – defaultní, neumí transakce, umí fulltext
InnoDB – transakce, cizí klíče, neumí fulltext (a nebo už ano?)
MEMORY (HEAP) – v paměti; neumí transakce
ARCHIVE – velké množství dat bez indexů
CSV – v textovém souboru ve formátu hodnot oddělených čárkou
FEDERATED – v databázi na jiném serveru; místní server se připojí ke vzdálenému serveru a pomocí SQL čte nebo upravuje vzdálenou databázi
MERGE (MRG_MYISAM) – neumí transakce; práce s několika MyISAM tabulkami stejné struktury jakoby to byla jedna; umožňuje z takto spojené tabulky číst ale pro zápis musí mít tabulka nastaveno do které skutečné tabulky zapisovat
BDB (BerkeleyDB) – transakce; odstraněno ve verzi 5.1
EXAMPLE – šablona pro vývojáře nových typů tabulek
BLACKHOLE – černá díra; data přijímá, vrací vždy prázdný výsledek
ISAM – původní; nahrazeno MyISAM
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.
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).
Běžný index.
Unikátní index – nedovolí do tabulky vložit více záznamů se stejnou hodnotou sloupce, nad kterým je index definován.
Primární klíč – označuje sloupec, který jednoznačně identifikuje libovolný záznam v tabulce; může být jen jeden v tabulce.
Provedení několika činností dohromady jako jedné.
Nelze provést jen část – transakce se vždy musí provést celá nebo vůbec.
Když je potřeba v půlce skončit, musí se vrátit všechny dosavadní změny.
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í.
V databázi máme následující tabulky:
osoby se sloupci osoba_id a jméno
psi se sloupci pes_id, majitel a rasa
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
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.
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éž.
SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2); SELECT * FROM lidi WHERE mesto IN (SELECT mesto FROM mesta);
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.
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.
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
Tiskni
Sdílej:
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 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ší 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.
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.
"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?
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ří?
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…
To by sedlo, Hot Backup v MySQL teprv bude (možná ), 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.
)
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í.
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.
co jsem všechno nevěděl a nikdy mi to nechyběloa to jste predtim mysql i nejak pouzival?
a to jste predtim mysql i nejak pouzival?ano, spokojeně ;)
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?
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.
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?
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ě).