Mysql
 sql >> Baza danych >  >> RDS >> Mysql

InnoDB wstawia rekord tylko wtedy, gdy istnieje odwołanie id (bez KLUCZY OBCYCH)

Możesz USUNĄĆ kategorię tylko wtedy, gdy nie ma pasującego żartu:

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;

Jeśli istnieją jakieś żarty dla kategorii, sprzężenie je znajdzie, a zatem sprzężenie zewnętrzne zwróci wynik inny niż null. Warunek w klauzuli WHERE eliminuje wyniki inne niż null, więc całkowite usunięcie będzie pasować do zera wierszy.

Podobnie możesz WSTAWIĆ żart do kategorii tylko wtedy, gdy kategoria istnieje:

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

Jeśli nie ma takiej kategorii, SELECT zwraca zero wierszy, a INSERT oznacza brak operacji.

Oba te przypadki tworzą wspólną blokadę (S-lock) w tabeli kategorii.

Demonstracja S-locka:

W jednej sesji prowadzę:

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

W drugiej sesji biegam:

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

Widać, że tworzy to blokadę IS na stole foo i blokadę S na jednym rzędzie foo, stole, z którego czytam.

To samo dzieje się w przypadku wszystkich hybrydowych operacji odczytu/zapisu, takich jak SELECT...FOR UPDATE , INSERT...SELECT , CREATE TABLE...SELECT , aby zablokować odczytywane wiersze przed modyfikacją, gdy są one potrzebne jako źródło operacji zapisu.

IS-lock to blokada na poziomie tabeli, która zapobiega wykonywaniu operacji DDL na tabeli, więc nikt nie wydaje polecenia DROP TABLE lub ALTER TABLE podczas gdy ta transakcja zależy od niektórych treści w tabeli.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak pobrać dane z bazy danych MySQL do programu Excel

  2. Jak wybrać tekst tablicy mysql i porównać?

  3. sprawdź, czy kolumna istnieje przed ALTER TABLE -- mysql

  4. Najlepszy sposób na zapisywanie zapytań wyszukiwania użytkowników w ElasticSearch?

  5. Tabela natywna „performance_schema”.'??? ma złą strukturę