Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

InnoDB hanya memasukkan catatan jika id yang direferensikan ada (tanpa KUNCI ASING)

Anda dapat MENGHAPUS kategori hanya jika tidak ada lelucon yang cocok:

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;

Jika ada lelucon untuk kategori tersebut, gabungan akan menemukannya, dan oleh karena itu gabungan luar akan mengembalikan hasil yang bukan nol. Kondisi dalam klausa WHERE menghilangkan hasil bukan nol, sehingga penghapusan keseluruhan akan cocok dengan nol baris.

Demikian juga, Anda dapat MEMASUKKAN lelucon ke kategori hanya jika kategori tersebut ada:

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

Jika tidak ada kategori seperti itu, SELECT mengembalikan baris nol, dan INSERT adalah larangan.

Kedua kasus ini membuat kunci bersama (S-lock) pada tabel kategori.

Peragaan kunci-S:

Dalam satu sesi saya menjalankan:

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

Di sesi kedua saya menjalankan:

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

Anda dapat melihat bahwa ini membuat IS-lock pada tabel foo, dan S-lock pada satu baris foo, tabel yang saya baca.

Hal yang sama terjadi untuk semua operasi baca/tulis hibrid seperti SELECT...FOR UPDATE , INSERT...SELECT , CREATE TABLE...SELECT , untuk memblokir baris yang sedang dibaca agar tidak dimodifikasi saat dibutuhkan sebagai sumber untuk operasi tulis.

IS-lock adalah kunci level tabel yang mencegah operasi DDL pada tabel, jadi tidak ada yang mengeluarkan DROP TABLE atau ALTER TABLE sementara transaksi ini tergantung pada beberapa konten dalam tabel.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara termudah untuk mengubah array byte menjadi Blob di java

  2. Permintaan MySQL untuk mendapatkan hitungan per bulan

  3. Bagaimana cara mengganti operator OR dengan operator UNION?

  4. Format catatan kehadiran kelas SQL Query

  5. Codeigniter simple_query vs. pembuat kueri (masukkan, perbarui, dan hapus)