MySQLエラー1099(HY000)の原因と解決方法:READロックされたテーブルを更新するには
MySQLエラー1099(HY000)とは
MySQLでテーブルに対してLOCK TABLES ... READを実行して読み取りロックをかけた状態では、そのテーブルへのINSERTやUPDATEなどの更新操作を行うことができません。この状態で更新を試みると、「ERROR 1099 (HY000): Table 'xxx' was locked with a READ lock and can't be updated」というエラーが発生します。
このエラーを解消するには、UNLOCK TABLESステートメントを使ってロックを解除する必要があります。以下に、実際の動作を例とともに確認していきましょう。
1. テーブルを作成する
まず、サンプル用のテーブルを作成します。
mysql> create table demo6
-> (
-> country_name varchar(100)
-> );
Query OK, 0 rows affected (1.51 sec)
2. レコードを挿入する
INSERTコマンドを使って、いくつかのレコードを追加します。
mysql> insert into demo6 values('US');
Query OK, 1 row affected (0.11 sec)
mysql> insert into demo6 values('UK');
Query OK, 1 row affected (0.08 sec)
mysql> insert into demo6 values('AUS');
Query OK, 1 row affected (0.11 sec)3. テーブルの内容を確認する
SELECT文で登録済みのレコードを表示してみましょう。
mysql> select * from demo6;
実行結果は以下の通りです。
+--------------+
| country_name |
+--------------+
| US |
| UK |
| AUS |
+--------------+
3 rows in set (0.00 sec)
4. 読み取りロック(READロック)をかける
次に、このテーブルに対して読み取り専用のロックを設定します。
mysql> lock tables demo6 read;
Query OK, 0 rows affected (0.00 sec)
5. ロック中に挿入を試みるとエラーが発生する
READロックがかかった状態でレコードを挿入しようとすると、以下のようなエラーが出力されます。
mysql> insert into demo6 values('IND');
ERROR 1099 (HY000): Table 'demo6' was locked with a READ lock and can't be updatedこれが本記事で扱っている「エラー1099」です。READロック中のテーブルは参照のみ可能で、更新操作は一切受け付けられません。
6. UNLOCK TABLESでロックを解除する
エラーを回避して再度挿入できるようにするには、UNLOCK TABLESを実行してロックを解除します。
mysql> UNLOCK TABLES;
Query OK, 0 rows affected (0.00 sec)
7. ロック解除後に再度挿入する
ロック解除後は、同じテーブルに問題なくレコードを挿入できます。
mysql> insert into demo6 values('IND');
Query OK, 1 row affected (0.09 sec)もう一度SELECT文で内容を確認してみましょう。
mysql> select * from demo6;
実行結果は以下の通りです。
+--------------+
| country_name |
+--------------+
| US |
| UK |
| AUS |
| IND |
+--------------+
4 rows in set (0.00 sec)
まとめ
MySQLの「ERROR 1099 (HY000)」は、テーブルがREADロックされているために更新操作が拒否されることで発生します。LOCK TABLES ... READでロックしたテーブルを更新したい場合は、UNLOCK TABLESを実行してロックを解除してから操作を行いましょう。なお、セッションを終了してもロックは自動的に解放されるため、接続が切れた場合にも同様に更新が可能になります。
-
Javaを使ってMySQLテーブルにレコードを挿入する方法
はじめに本記事では、JavaのJDBC(Java Database Connectivity)を使用して、MySQLデータベースのテーブルにレコードを挿入する手順を解説します。まずテーブルを作成し、その後Javaプログラムからデータを登録するまでの一連の流れを見ていきましょう。1. MySQLでテーブルを作成するまず、データを挿入するためのテーブルを作成します。以下はMySQLでテーブルを作成するクエリです。mysql> create table DemoTable( Id int, Name varchar(30),&
-
MySQLテーブルで先頭ゼロ付きの値を選択して挿入する方法
MySQLで連番に先頭ゼロ(先行ゼロ)を付けた値をテーブルに挿入したい場合は、INSERT INTO SELECT文とLPAD()関数を組み合わせることで実現できます。LPAD()は文字列を指定した長さまで左側を特定の文字で埋める関数で、これを使えば「001」「002」のような形式のIDを簡単に生成できます。テーブルの作成まず、サンプル用のテーブルを作成しましょう。mysql> create table DemoTable1967 ( Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, UserId varchar(20)