11. データベース操作,トランザク
ション
INSERTUPDATEDELETE、トランザク
ションの概念
1
URL: https://www.kkaneko.jp/de/ds/index.html
金子邦彦
謝辞:この資料では「いらすとや」のイラストを使用しています
理論と実践の両立
データベースシステムの能力の理解
データベース運用能力の向上
2
アウトライン
1. イントロダクション
2. データ操作
3. INSERT, DELETE, UPDATE
4. トランザクション
5. ロールバック
3
SQLFiddle のサイトにアクセス
Webブラザを使用
1. ェブブラザを開く
2. アドレスバーにSQLFiddleURLを入力
http://sqlfiddle.com/
URLが分からないときは、Googleなどの検索エンジンを利
用。「SQLFiddle」と検索し、表示された結果から
SQLFiddleェブサイトをクリック。
4
SQLFiddle の画面
5
右側のパネル: SQL問い合わせ
SELECT などを入力。
左側のパネル: テーブル定義、デー
タの追加など。SQLCREATE TABLE
INSERT INTO などを入力。
実行ボタン
結果ィンド
実行ボタン
SQLFiddle でのデータベース管理システムの選択
(高度な機能)
6
データベース管理システムの選択
(この授業では MySQL を使用)
11-1. イントロダクション
7
リレーショナルデータベースの仕組み
データをテーブルと呼ばれる表形式で保存
テーブル間関連で結ばれる。複雑な構造を持ったデータ
を効率的に管理することを可能に。
8
関連
商品
ID
商品名
単価
1
みかん
50
2
りんご
100
3
メロン
500
購入者
商品番号
X
1
X
3
Y
2
購入
商品テーブルと購入テーブ
9
関連
商品
ID
商品名
単価
1
みかん
50
2
りんご
100
3
メロン
500
購入者
商品番号
X
1
X
3
Y
2
購入
Xさんは、1みかんと,
3 メロンを買った
Yさんは、 2 りんごを買った
商品テーブルの情報
購入テーブルの情報
リレーショナルデータベースの重要性
1. データの整合性: リレーショナルデータベースは、デー
タの整合性を保持するための機能を有する。これにより、
誤ったデータや矛盾したデータが保存されるのを防ぐこ
とができる。
2. 柔軟な問い合わせ(クエリ)能力: リレーショナルデー
タベースのSQLStructured Query Language)の使用に
より、複雑な検索やデータの抽出が可能になる。
3. トランザクションの機能: 一連の操作全体を一つの単位
として取り扱ことができる機能。これにより、データ
の一貫性と信頼性が向上する。
4. セキュリティ: アクセス権限の設定などにより、セキュ
リティを確保。
データの安全な保管、効率的なデータ検索・操作、ビジネス
や研究の意思決定をサポート。 10
SQL によるテーブル定義
テーブル名商品
属性名ID、商品名、単価
属性のデータ型数値、テキスト、数値
データの整合性を保つための制約主キー制約
11
CREATE TABLE 商品 (
ID INTEGER PRIMAY KEY,
商品名 TEXT,
単価 INTEGER);
データ追加のSQL
12
商品
INSERT INTO 商品 VALUES(1, 'みかん', 50);
INSERT INTO 商品 VALUES(2, 'りんご', 100);
INSERT INTO 商品 VALUES(3, 'メロン', 500);
ID
商品名
単価
1
みかん
2
りんご
3
メロン
外部キー
外部キーは、他のテーブルの主キーを参照するキー
13
ID
商品名
単価
1
みかん
50
2
りんご
100
3
メロン
500
ID
購入者
商品ID
数量
1
X
1
10
2
Y
2
5
購入テーブルの外部キー「商品
ID」は、購入テーブルの主キー
ID」を参照
主キー
外部キー
購入テーブル
商品テーブル
SQL によるテーブル定義
テーブル名購入
属性名ID、購入者、商品ID、数量
属性のデータ型数値、テキスト、数値、数値
データの整合性を保つための制約主キー制約、参照整合
性制約
14
CREATE TABLE 購入 (
ID INTEGER PRIMARY KEY,
購入者 TEXT,
商品ID INTEGER,
数量 INTEGER,
FOREIGN KEY (商品ID) REFERENCES 商品(ID));
FOREIGN KEY … REFERENCES
PRIMARY KEY … REFERENCES はテーブル定義時に使用
し、あるテーブルの外部キーが別のテーブルの主キー参照
する「参照整合性制約」を示す
15
SQL の書き方
ID
商品名
単価
1
みかん
50
2
りんご
100
3
メロン
500
ID
購入者
商品ID
数量
1
X
1
10
2
Y
2
5
主キー
外部キー
CREATE TABLE 購入 (
ID INTEGER PRIMARY KEY,
購入者 TEXT,
商品ID INTEGER,
数量 INTEGER,
FOREIGN KEY (商品ID) REFERENCES 商品(ID));
主キー
演習1.テーブル定義と
データの追加、主キー制約
トピックス
1. SQL によるテーブル定義
2. 主キー制約 PRIMARY KEY
3. SQL によるデータの追加
4. 問い合わせ(クエリ)による
確認
16
Webブラザを使用
アドレスバーにSQLFiddleURLを入力
http://sqlfiddle.com/
URLが分からないときは、Googleなどの検索エンジンを利
用。「SQLFiddle」と検索し、表示された結果から
SQLFiddleェブサイトをクリック。
17
左側のパネルに、テーブル定義データの追加を行
SQL を入れる。(前のものは不要である)
18
CREATE TABLE 商品 (
ID INTEGER PRIMARY KEY,
商品名 TEXT,
単価 INTEGER);
INSERT INTO 商品 VALUES(1, 'みかん', 50);
INSERT INTO 商品 VALUES(2, 'りんご', 100);
INSERT INTO 商品 VALUES(3, 'メロン', 500);
CREATE TABLE 購入 (
ID INTEGER PRIMARY KEY,
購入者 TEXT,
商品ID INTEGER,
数量 INTEGER,
FOREIGN KEY (商品ID) REFERENCES 商品(ID));
INSERT INTO 購入 VALUES(1, 'X', 1, 10);
INSERT INTO 購入 VALUES(2, 'Y', 2, 5);
Build Schema」をクリック
19
右側のパネルに、問い合わせ(クエリ)を行SQL を入
れる。
Run SQL」をクリック
SQL 文が実行され、結果が表示される。
下側のインドで、結果を確認
20
SELECT * FROM 商品;
右側のパネルに、問い合わせ(クエリ)を行SQL を入
れる。
Run SQL」をクリック
SQL 文が実行され、結果が表示される。
下側のインドで、結果を確認
21
SELECT * FROM 購入;
右側のパネルに、問い合わせ(クエリ)を行SQL を入
れる。
Run SQL」をクリック
SQL 文が実行され、結果が表示される。
下側のインドで、結果を確認
22
SELECT 購入.購入者, 商品.商品名, 商品.単価 *購入.数量
FROM 購入
JOIN 商品 ON 購入.商品ID = 商品.ID;
自習1.「みかん」の単価を見つける
目的:特定の商品の単価を調べる方法を学ぶ
商品テーブルから「みかん」の単価を見つける SQL 文を書
いてください。
ヒント
SELECTWHEREを使用。選択のための条件は、商品名が
「みかん」であること
23
自習2.購入者Xの購入合計金額
目的:複数のテーブルを結合し、計算を行方法を学ぶ。
購入者Xが購入した商品の合計金額を計算するSQL文を書い
てください。合計金額は、各商品の単価と購入数量を掛け合
わせて求める。
ヒント
・購入テーブルと商品テーブルを結合する
・商品の単価と数量を掛け合わせて合計するために SUM(
.単価 * 購入.数量)
24
自習3.「りんご」を購入した人を見つける
目的:特定の商品を購入した人を特定する方法を学ぶ。
「りんご」を購入した購入者の名前を見つける SQL 文を書
いてください。
ヒント
購入テーブルと商品テーブルを結合
25
正解例
自習1
SELECT 単価 FROM 商品 WHERE 商品名 = 'みかん’;
自習2
SELECT SUM(商品.単価 * 購入.数量)
FROM 購入
JOIN 商品 ON 購入.商品ID = 商品.ID
WHERE 購入者 = 'X';
自習3
SELECT 購入.購入者
FROM 購入
JOIN 商品 ON 購入.商品ID = 商品.ID
WHERE 商品.商品名 = 'りんご';
26
11-2. データベース操作
27
データベース操作
INSERT(追加)
テーブルに新しい行を追加
SELECT(問い合わせ)
必要なデータを検索、加工
DELETE(削除)
テーブルから一つまたは複数の行を削除
UPDATE(更新)
既存の値を変更
28
データベース操作を学ぶことの重要性
データベースでのデータ維持
データを最新の状態に保つことを、効率的に行える
データの整合性とセキュリティの確保
正しいデータベース操作を行ことで、データの整合性と
セキュリティを保つことができる
29
データベース操作での留意
データ整合性の確保
更新や削除を行際、データの整合性を保つために正確な条
件を指定すること
トランザクションの管理
複数のデータベース操作を一連の単一処理として扱場合、
トランザクションを適切に管理する。
30
名前
昼食
料金
A
そば
250
B
カレーライス
400
C
カレーライス
400
D
うどん
250
正規化されていない
テーブルでは、
特に注意が必要
BEGIN TRANSACTION;
UPDATE 口座 SET 残高 = 残高 - 1000 WHERE 口座番号 = 'A';
UPDATE 口座 SET 残高 = 残高 + 1000 WHERE 口座番号 = 'B';
COMMIT;
口座Aから1000円引き出す
口座B1000円預け入れる
トランザクションは、「複数のデータベース操作を
連の一処理として扱こと」を意味する
普通のプログラミングでのデータ更新とデー
ベース操作の違い
31
データベース操作
普通のプログラミング
トランザク
ション管理
トランザクション管
理可能
トランザクション管理
困難
データベース
の整合性を保つ
制約の仕組みあり
整合性は必ずしも考慮
されてない
複数ユーザか
らの同時アクセ
同時アクセスを想定
済み
同時アクセスは必ずし
も想定されていない
データの永続
永続性あり
永続性なし(データは、
プログラムの実行期間
にのみ存在)
ここまでのまとめ
データベース操作の要点
追加INSERT で新規データを追加
問い合わせSELECT でデータを検索・取得。
更新UPDATE で既存データを変更
削除DELETE でデータを削除。
データベース操作の意点
更新・削除時データの整合を保
複数操作を含トランザクションを適切に管理
データベース操作と、プログラミングでのデータ操作の違
データベースデータの永続性、複数ユーザーの同時アクセス、
トランザクション、制約をサポート。
プログラミングではデータは一時的で、同時アクセスとトラン
ザクション管理は困難。
32
11-3. INSERTDELETE
UPDATE
33
追加 INSERT
34
名前
昼食
料金
A
そば
250
B
カレーライス
400
C
カレーライス
400
D
うどん
250
テーブル Tテーブル T
名前
昼食
料金
insert into T values('A', 'そば', 250);
insert into T values('B', 'カレーライス', 400);
insert into T values('C', 'カレーライス', 400);
insert into T values('D', 'うどん', 250);
INSERT はテーブルに新しい行を追加する
基本形
INSERT INTO テーブル名 VALUES (1, 2, ...);
削除 DELETE
35
名前
昼食
料金
A
そば
250
B
カレーライス
400
C
カレーライス
400
D
うどん
300
名前
昼食
料金
B
カレーライス
400
C
カレーライス
400
D
うどん
300
delete from T where 名前 = 'A';
テーブル Tテーブル T
DELETE はテーブルから一つまたは複数の行を削除
基本形
DELETE FROM テーブル名 WHERE 条件;
更新 UPDATE
36
名前
昼食
料金
A
そば
250
B
カレーライス
400
C
カレーライス
400
D
うどん
250
名前
昼食
料金
A
そば
250
B
カレーライス
400
C
カレーライス
400
D
うどん
300
update T set 料金 = 300 where 昼食 = 'うどん';
テーブル Tテーブル T
UPDATE は既存の値を変更するために使用
基本形
UPDATE テーブル名 SET 1 = 1, 2 = 2, ... WHERE 条件;
SQL によるデータベース操作
37
操作
SQL
の例
テーブルに新しい
行を追加
insert into T values('A', '
そば', 250);
テーブルから一つ
または複数の行を
削除
delete from T where
名前 = 'A';
既存の値を変更
update T set
料金 = 300 where 昼食 = 'うどん';
INSERT, DELETE, UPDATE を使用する際の注意点
追加 INSERT での注意点
主キーの列に、重複する値を挿入することはできない
削除 DELETE、更新 UPDATE での注意点
データの誤操作防止
必要なデータを誤って削除したり、正確なデータを破損させ
ないよ慎重に操作を行
ロールバックの活用
誤った操作を行った場合は、トランザクションを終了する前
であれば、ロールバック機能を使用して変更を元に戻すこと
ができる。
これにより、データベース操作の取り消しが可能
38
SQLと通常のプログラミング言語の比較
SQLでの更新例
BEGIN TRANSACTION;
UPDATE products SET price = 25 WHERE name = 'banana’;
COMMIT;
Pythonでの更新例
for item in products:
if item['name'] == 'banana':
item['price'] = 25
39
トランザクションの管理が可能
データベース操作まとめ
INSERT(追加)
テーブルに新しい行を追加
形式: INSERT INTO テーブル名 VALUES (1, 2, ...);
SELECT(問合わせ
必要なデータを検索、加工
形式:SELECTFROM … WHERE …
DELETE(削除)
テーブルから一つまたは複数の行を削除
形式: DELETE FROM テーブル名 WHERE 条件;
UPDATE更新
既存の値を変更
形式: UPDATE テーブル名 SET 1 = 1, 2 = 2, ... WHERE 条件;
40
演習2.データベース操作
トピックス
1. SQL によるテーブル定義
2. 追加:INSERT
3. 削除:DELETE
4. 更新:UPDATE
5. 問い合わせ(クエリ)による
確認
41
Webブラザを使用
アドレスバーにSQLFiddleURLを入力
http://sqlfiddle.com/
URLが分からないときは、Googleなどの検索エンジンを利
用。「SQLFiddle」と検索し、表示された結果から
SQLFiddleェブサイトをクリック。
42
左側のパネルに、テーブル定義データの追加を行
SQL を入れる。(以前の SQL は使用しない)
43
CREATE TABLE T (
名前 TEXT,
昼食 TEXT,
料金 INTEGER);
INSERT INTO T VALUES('A', 'そば', 250);
INSERT INTO T VALUES('B', 'カレーライス', 400);
INSERT INTO T VALUES('C', 'カレーライス', 400);
INSERT INTO T VALUES('D', 'うどん', 250);
Build Schema」をクリック
44
右側のパネルに、問い合わせ(クエリ)を行SQL を入
れる。
Run SQL」をクリック
SQL 文が実行され、結果が表示される。
下側のインドで、結果を確認
45
SELECT * FROM T;
「カレーライス」の料金を450円に変更
左側のパネルに、次の SQL 書き加えて、「Build
Schema」をクリック
右側の「SELECT * FROM T;」はそのままで、 Run
SQL」をクリック。結果を確認
46
UPDATE T SET 料金 = 450 WHERE 昼食 = 'カレーライス';
名前が'C'の人の昼食を「ラーメン」に変更
左側のパネルに、次の SQL 書き加えて、「Build
Schema」をクリック
右側の「SELECT * FROM T;」はそのままで、 Run
SQL」をクリック。結果を確認
47
UPDATE T SET 昼食 = 'ラーメン' WHERE 名前 = 'C';
名前が'B'の行を削除
左側のパネルに、次の SQL 書き加えて、「Build
Schema」をクリック
右側の「SELECT * FROM T;」はそのままで、 Run
SQL」をクリック。結果を確認
48
DELETE FROM T WHERE 名前 = 'B';
自習4.「そば」と「どん」の料金を変更する
目的:特定の条件に合致する複数の行のデータを更新する方
法を学ぶ。
「そば」と「どん」の料金を300円に更新してください。
ヒント:WHEREを使って選択し、UPDATEで料金を変更し
ます。
49
自習5.新しいメニュー項目の追加
目的:新しいレコードをテーブルに追加する方法を学ぶ。
新しく「E」さんが、「天ぷら」を料金500円を食べたとい
情報を、Tテーブルに追加してください
ヒント:INSERT INTOを使用
50
正解例と解説
自習4.
UPDATE T SET 料金 = 300 WHERE 昼食 = 'そば' OR 昼食 = 'どん';
Tテーブル内で昼食が「そば」または「どん」であるすべての行の料
金を300円に更新します。
自習5.
INSERT INTO T VALUES ('E', '天ぷら', 500);
このSQL文は新しい行をTテーブルに追加し、名前は「E」、昼食は「天
ぷら」、料金は500円となります。 51
11-4. トランザクション
52
普通のプログラミングでのデータ更新とデー
ベース操作の違い
53
データベース操作
普通のプログラミング
トランザク
ション管理
トランザクション管
理可能
トランザクション管理
困難
データベース
の整合性を保つ
制約の仕組みあり
整合性は必ずしも考慮
されてない
複数ユーザか
らの同時アクセ
同時アクセスを想定
済み
同時アクセスは必ずし
も想定されていない
データの永続
永続性あり
永続性なし(データは、
プログラムの実行期間
にのみ存在)
トランザクションの管理
複数のデータベース操作を一連の単一処理として扱
合、トランザクションを適切に管理する。
54
BEGIN TRANSACTION;
UPDATE 口座 SET 残高 = 残高 - 1000 WHERE 口座番号 = 'A';
UPDATE 口座 SET 残高 = 残高 + 1000 WHERE 口座番号 = 'B';
COMMIT;
口座Aから1000円引き出す
口座B1000円預け入れる
トランザクションは、「複数のデータベース操作を
一連の単一処理として扱こと」を意味する
口座Aから口座Bへの 1000円の移動では、2つのデータベー
ス操作を単一処理として扱う
トランザクションの管理
トランザクションの原則として、処理途中のデータは、
部には見えない
トランザクションの終了時に、コミットまたはロールバッ
選択
すべてのデータベース操作が反映される(コミット
行われたデータ変更はすべて取り消しされ(ロールバッ
)、データはトランザクション開始時の状態に戻る
55
BEGIN TRANSACTION;
UPDATE 口座 SET 残高 = 残高 - 1000 WHERE 口座番号 = 'A';
UPDATE 口座 SET 残高 = 残高 + 1000 WHERE 口座番号 = 'B';
COMMIT;
口座Aから1000円引き出す
口座B1000円預け入れる
「口座Aから1000円引き出す」などの結果は、
トランザクションがコミットするまで、外部
には見えない
データベースの整合性を保つ仕組み
主キー制約
参照整合性制約 など
56
メニューから
お選びください
枝豆はないんですか?
すべてのデータベース操作において、制約に違反していない
ことが確認される
データベースの整合性を保つ仕組み
1. すべてのデータベース操作において、制約に違反してい
ないことが確認される
2. 制約違反のデータベース操作は、拒否される
3. 制約違反の際は、通常、自動でロールバックが行われ、
トランザクション開始後のすべてのデータ変更が取り消
される
57
BEGIN TRANSACTION;
UPDATE 口座 SET 残高 = 残高 - 1000 WHERE 口座番号 = 'A';
UPDATE 口座 SET 残高 = 残高 + 1000 WHERE 口座番号 = 'B';
COMMIT;
途中で制約違反があったとき、トランザクション開始後の
すべてのデータ変更が取り消される
複数ユーザからの同時アクセス
58
利用者A
利用者B
利用者C
コンピュータ
ネットワーク
データベースシステム
同時実行されるデータベース操作互いに干渉しないように、
データベースシステムの側で制御される
データの永続性
59
データベース管理システム
ユーザ
コミットしたトランザクションのデータベース操作は、
データベース内に残る
トランザクションの開始
begin transaction
ロールバック
rollback
コミット
commit
SQL でのトランザクション開始、ロールバック、コミット
60
ここまでのまとめ
トランザクションの管理
複数のデータベース操単一の処理単位として扱
トランザクション内の操作は全て実行される(コミット)か、実行さ
れないか(ロールバックを保証する。
コミット時には全ての操作が反映され、ロールバック時には全ての変
更が取り消される。
処理途中のデータは外部には見えな
制約とトランザクション
制約違反が発生した場合、操作は拒否され通常は自動でロールバッ
される。
同時アクセス
データベースシステムは、同時実行されるデータベース操作が互いに
干渉しないよ制御する。
61
11-5. ロールバック
62
ロールバックとは
63
ロールバックは,データベースを,トランザク
ション開始時点戻すこと
リレーショナルデータベース管理システム
準機能
ロールバックしたトランザクションだけが元に
戻る(他の利用者に影響を与えることはない
64
begin transaction
操作1、操作2、操作3
と操作していて、
最初に戻したくなったら・・・
操作1
操作2
操作3
rollback
rollback コマンド
データベース管理
システム
ロールバック (rollback) のイメー
トランザクション開始
65
begin transaction
begin transaction」は、トランザクション開始
データベース管理システム
ユーザ
データベース操作中
66
begin transaction
操作1
操作2
データベース管理システム
ユーザ
ロールバック (rollback)
67
トランザクション開始
操作1
操作2
操作3
rollback
ユーザ データベース管理システム
ロールバックのコマンド rollback の実行により、行われ
データ変更はすべて取り消しになる。
データはトランザクション開始時の状態に戻る
ロークバックが発生するタイミング
rollback コマンドの実行
制約違反 (自動でロールバック)
停電などのシステムからの回復時 (自動
でロールバック)
データベースのデータを適切な状態に保つために
重要な機能
68
操作途中でのシステムダ
69
トランザクション開始
操作1
操作2
操作3
作業のスタート
作業のやりかけ
もしここで,
システムがダ
システムの再起動時に
自動でロールバック
×
×
×
データベース管理システムの責任で,
すべての操作を取り消す
全体まとめ
INSERT
新規データの追加にINSERTコマンドを使用。
形式: INSERT INTO テーブル名 VALUES (1, 2, ...);
UPDATE
既存データの変更にUPDATEコマンドを使用。
形式: UPDATE ーブル名 SET 1 = 1, 2 = 2, ... WHERE 条件;
DELETE
データの削除にDELETEコマンドを使用。
形式: DELETE FROM テーブル名 WHERE 条件;
70
全体まとめ
トランザクションの管理
複数の操作を単一処理として管理。
BEGIN TRANSACTION;で開始し、COMMIT;で終了。
データ整合性の確保
主キー制約や参照整合性制約を通じて整合性を保つ。
制約違反があれば自動ロールバック。
複数ユーザーの同時アクセス
同時実行される操作が互いに干渉しないよ制御。
データの永続性
コミットされた操作はデータベースに永続的に保存。
ロールバック (rollback)
不要になった操作を取り消すために使用。
制約違反やシステムダン時にも自動で発生。
71