sql >> Databáze >  >> RDS >> Mysql

InnoDB vloží záznam pouze v případě, že existuje odkazované id (bez CIZÍCH KLÍČŮ)

Kategorii můžete ODSTRANIT, pouze pokud se nejedná o žádný odpovídající vtip:

DELETE c FROM categories AS c
LEFT OUTER JOIN jokes AS j ON c.id=j.category_id
WHERE c.id = $category_id AND j.category_id IS NULL;

Pokud pro kategorii existují nějaké vtipy, spojení je najde, a proto vnější spojení vrátí nenulový výsledek. Podmínka v klauzuli WHERE eliminuje nenulové výsledky, takže celkové odstranění bude odpovídat nulovým řádkům.

Podobně můžete vtip VLOŽIT do kategorie pouze v případě, že kategorie existuje:

INSERT INTO jokes (category_id, joke_text)
SELECT c.id, '$joke_text'
FROM categories AS c WHERE c.id = $category_id;

Pokud žádná taková kategorie neexistuje, SELECT vrátí nula řádků a INSERT je bez operace.

Oba tyto případy vytvářejí sdílený zámek (S-lock) na tabulce kategorií.

Ukázka zámku S:

V jedné relaci spustím:

mysql> INSERT INTO bar (i) SELECT SLEEP(600) FROM foo;

Ve druhé relaci spustím:

mysql> SHOW ENGINE INNODB STATUS\G
. . .
---TRANSACTION 3849, ACTIVE 1 sec
mysql tables in use 2, locked 2
2 lock struct(s), heap size 376, 1 row lock(s)
MySQL thread id 18, OS thread handle 0x7faefe7d1700, query id 203 192.168.56.1 root User sleep
insert into bar (i) select sleep(600) from foo
TABLE LOCK table `test`.`foo` trx id 3849 lock mode IS
RECORD LOCKS space id 22 page no 3 n bits 72 index `GEN_CLUST_INDEX` of table `test`.`foo` trx id 3849 lock mode S

Můžete vidět, že to vytvoří IS-zámek na stole foo a S-lock na jedné řadě foo, stole, ze kterého čtu.

Totéž se děje pro jakékoli hybridní operace čtení/zápisu, jako je SELECT...FOR UPDATE , INSERT...SELECT , CREATE TABLE...SELECT , k zablokování úprav čtených řádků, když jsou potřeba jako zdroj pro operaci zápisu.

IS-lock je zámek na úrovni tabulky, který zabraňuje operacím DDL na stole, takže nikdo nevydává DROP TABLE nebo ALTER TABLE zatímco tato transakce závisí na nějakém obsahu v tabulce.




  1. Jak vložím prázdný řádek, ale automatické číslování se aktualizuje správně?

  2. Chyba serveru SQL 110:V příkazu INSERT je méně sloupců než hodnot zadaných v klauzuli VALUES.

  3. Občas získávání SqlException:Vypršel časový limit

  4. Dynamická konverze řetězce na název sloupce. MySQL