SAK 図書館
MySQL 編17 - テーブルコピー、レコード追加、修正、削除、表切り捨て
■テーブルコピー
・問い合わせ結果で、新たにテーブルを作成することができる。
別テーブルへ移動するには、テーブルコピー後にオリジナルを delete、
新テーブルに整合性規則を追加するか、作成済みテーブルに insert で
select 追加すると良い。(下記のレコード追加も参照のこと。)
(表コピー)
create table workw as
select
*
from testm
where key1 like 'a%'
;
alter table workw type=InnoDB;
select * from workw;
+------+-------+-------+-------+
| key1 | data1 | data2 | data3 |
+------+-------+-------+-------+
| a001 | 1 | 2 | 3 |
| a011 | 1 | 2 | 3 |
+------+-------+-------+-------+
・集合問い合わせ結果で、新たにテーブルを作成することもできる。
create table work2w as
select
*
from testm
where key1 like 'a%'
union all
select
*
from testm
where key1 like 'a%'
;
alter table work2w type=InnoDB;
select * from work2w;
+------+-------+-------+-------+
| key1 | data1 | data2 | data3 |
+------+-------+-------+-------+
| a001 | 1 | 2 | 3 |
| a011 | 1 | 2 | 3 |
| a001 | 1 | 2 | 3 |
| a011 | 1 | 2 | 3 |
+------+-------+-------+-------+
・空のテーブルをコピーしたい場合は、ありえないキーで抽出する。
create table work3w as
select
*
from testm
where key1 = '@'
;
alter table work2w type=InnoDB;
select * from work3w;
Empty set (0.00 sec)
■レコード追加(レコード更新、インサート)
・テーブルにレコードを追加する。
insert into testm (
key1,
data1,
data2,
data3
)
values (
'a001',
100,
200,
300
);
・追加データの並びがテーブル定義と同一であるなら、項目名を省略できる。
insert into testm values (
'a001',
100,
200,
300
);
・default が指定されていれば、Oracle のようにデータ値として、default
と書くことができる。
create table test4m (
key1 char(8),
data1 int8,
data2 int8,
data3 int8 default 123
) type=InnoDB;
insert into test4m values (
'a001',
100,
200,
default
);
select * from test4m;
+------+-------+-------+-------+
| key1 | data1 | data2 | data3 |
+------+-------+-------+-------+
| a001 | 100 | 200 | 123 |
+------+-------+-------+-------+
・入力が必須でない項目は、省略して追加も可能である。
default 指定や not null 制約がない場合、NULL が割り当てられる。
create table test5m (
key1 char(8),
data1 int8,
data2 int8,
data3 int8 default 123
) type=InnoDB;
-- この形式は MySQL ではエラーになるので注意 --
insert into test5m values (
'a001',
100
);
-- データを省略する場合は、フィールド名の指定が必要 --
insert into test5m (key1, data2) values (
'a001',
100
);
select * from test5m;
+------+-------+-------+-------+
| key1 | data1 | data2 | data3 |
+------+-------+-------+-------+
| a001 | NULL | 100 | 123 |
+------+-------+-------+-------+
・問い合わせ結果を別テーブルへレコード追加することも可能である。
別テーブルへレコード移動するには、別テーブルへレコード追加後にオリジ
ナルを delete すると良い。(上記のテーブルコピーも参照のこと。)
(副問い合わせ、レコードコピー)
insert into workw
select
key1,
data1,
data2,
data3
from testm where key1 like 'a%'
;
・特定の項目を固定値にしたりもできる。
insert into workw
select
key1,
data1,
data2,
111
from testm where key1 like 'a%'
;
・特定の項目だけをセットすることもできる。
insert into workw (key1, data2)
select
key1,
data2
from testm where key1 like 'a%'
;
・NULL を項目にセットすることもできる。
もちろん、not null 制約があれば、NULL をセットすることはできない。
insert into testm (
key1,
data1,
data2,
data3
)
values (
'a001',
100,
200,
NULL
);
・データ中にシングルコーテーション「'」を含める場合は、「''」と 2 個
続けて書くと 1 個の「'」が文字として入る。
insert into testm (
key1,
data1,
data2,
data3
)
values (
'a0''1',
100,
200,
300
);
■レコード修正(レコード更新、アップデート)
・テーブルのレコードを修正する。
where 句には select と同様に複雑な指定が可能である。
update testm set
data1 = 111,
data2 = 222,
data3 = 333
where key1 = 'a001'
;
・MySQL では、insert は default で追加することができるが、
update では指定のしようがなかった。
update test4m set
data1 = 111,
data2 = 222,
data3 = default -- エラーになる
where key1 = 'a001'
;
・一項目だけの修正も可能である。
update testm set
data3 = 333
where key1 = 'a001'
;
・NULL を項目にセットすることもできる。
もちろん、not null 制約があれば、NULL をセットすることはできない。
update testm set
data1 = 111,
data2 = 222,
data3 = NULL
where key1 = 'a001'
;
■レコード削除(レコード更新、デリート)
・テーブルのレコードを削除する。
where 句には select と同様に複雑な指定が可能である。
delete from testm
where key1 = 'a001'
;
・この例では、testm の key1 の先頭が「a」で始まるレコードを全て削除して
いる。
delete from testm
where key1 like 'a%'
;
・この例では、testm の全レコードを削除している。
件数が多いとレスポンスに問題がある。
テーブルを空にするのが目的なら、表切り捨て truncate を使う方が高速で
現実的である。
delete from testm;
■トランザクション
・MySQL のトランザクションは、標準は自動コミットとなっている。
ADO - ODBC では、cn.BeginTrans で手動コミットになる。
JDBC では、cn.setAutoCommit(false); でオートコミットを解除して、
手動コミットにする。
・mysql での対話入力では、次のように begin;、commit; でトランザクショ
ン処理をする。ロールバックは、rollback; である。
begin;
insert into testm values ('a001', 100, 200, 300);
insert into testm values ('a002', 102, 200, 300);
insert into testm values ('a003', 103, 200, 300);
commit;
begin;
insert into testm values ('z001', 100, 200, 300);
insert into testm values ('z002', 102, 200, 300);
insert into testm values ('z003', 103, 200, 300);
rollback;
■排他制御(レコードロック)
・レコード追加、修正、削除では、レコードレベルの排他制御が働く。
デッドロック回避の考え方は、他のファイルシンテムと同様である。
テーブルロック(表ロック) として lock table もある。
・問い合わせで行ロックする方法として、for update 句がある。
for update nowait は、ロック解除を待たずにエラーを返す。
次の例は、ロックされていたら待って問い合わせる。
select * from testm where key1 = 'a001'
for update
;
・nowait はエラー構文となった。
select * from testm where key1 = 'a001'
for update nowait
;
■表切り捨て
・truncate は、表を切り捨ててクリアする。
(テーブル切り捨て、テーブルクリア、表クリア、テーブル内データ消去)
truncate table testm;
■ストアドファンクション
・create function はあるが、C 言語か何かで関数を用意する必要があるよう
に読める。Oracle の PL/SQL や PostgreSQL の PL/pgSQL のようなスクリ
プト言語は持っていない。
たぶん、トリガーも使えないと思われる。
■MySQL 編資料
■PostgreSQL 編、JAVA Servlet、JSP 編資料
■SQL 基礎編資料
■SQL 基礎実地編資料
■SQL チューニング編資料
■Oracle PL/SQL 編資料