【確認】サーバの停止手順
xampp-control コントロールパネル
Apache STOP
MySQL STOP
Quitボタン で終了
xボタンで終了してはいけない
こちらに掲載の作業を行います。
前回の補足:
第2回課題 問3 複合キーの解説
今回の演習内容に 複合キー の設定が含まれています。設定作業に合わせて、その必要性と考え方を解説します。
まだ採点していないので、第2回の 問2 問3 を未回答の人は提出してください。提出済みの受講生は再提出も受け付けます。
次の用語は理解できていますか?
DBMS、テーブル、フィールド、キー、レコード、PHP、Apache、MySQL
出来ていない受講生は用語について調べてください。
第2回のXAMPPP演習の 応用 チェックポイント5 実演で示す
プログラム言語と SQLの対応について
独立言語方式
親言語方式
WordPress は、PHP と MySQL で動いている。PHPのコードに SQL のコマンドを文字列として埋め込み、MySQLをモジュール経由で操作してBlogの記事やコメントを管理している。
その他: xamppのバックアップについて、T:ドライブの xampp フォルダはだれでも自由に利用できる設定になっている。前回や今回の演習内容は消えてしまう場合があるので、フォルダ全体を USBメモリなどにバックアップしておくとよい。
今回の演習ではMySQLの
データベース作成
テーブル作成
データ追加
を php MyAdminのUIから行うが、画面に表示される「クエリー」も確認するとよい。
phpMyAdmin上の操作は全てSQLのコマンド(クエリー)として実行されている。
第2回の課題をAIで自己採点してみよう。以下の様に指示して、自分の解答を入力すると採点できる。アドバイスも貰えるのでぜひ試そう。
XAMPPの PHPMyAdmin の操作練習のために学生名簿データベース を作成する。
表(テーブル)を3つ作成する。
学生(学生名簿) と 学生団体(グループ名) と それらの関係を記録する 参加登録(学生所属グループ) の3つである。
例)
テーブル1 学生名簿
テーブル2 グループ名
テーブル3 学生所属グループ
演習1/5~2/5で 学生名簿テーブル を作成する。
演習3/5~5/5で 学生名簿データベース に グループ登録機能 を追加する。
準備:
XAMPPのコントロールパネルを起動しWeb と データベースサーバを起動する。
概略手順
学生情報データベース mytest学籍番号 作成
テーブル students 作成
テーブルのフィールド設定
設定例)
フィールド id 学籍番号を記録
フィールド name 名前を記録
フィールド mail メールアドレスを記録
フィールド tel 電話番号を記録
テーブルにレコードを追加
レコードの確認
2017年版
学生名簿テーブルの作成
メニューの データベース をクリックし、新規データベースを作成する から、
データベース名 mytest学籍番号 で作成
照合順序 utf8mb4_general_ci を指定(文字コードの指定)
左サイドのツリーからデータベース名をクリックしてデータベース mytest学籍番号 に移動する。
「テーブルを作成」に以下のように入力して実行ボタンを押すか、
データベース名の下の「新規作成」からテーブル students を作成する。
テーブル students の各フィールドの設定 + 主キーの設定作業:
以下の画像を参考にしてテーブルのフィールドの設定と主キーの設定を行う。
テーブルのフィールドの設定画面)
フィールドは、タイプを VARCHAR(可変長文字列) や INT(整数値)を指定して 文字数や桁数の指定する(上記参照)
※フィールド設定で tel の型を int(11) とするのは不適切。整数値11桁のint(11)では090-1234-7890 のような番号の先頭の 0 が表現できない。
主キーの設定について:
students テーブルで id フィールを主キーに設定するには インデックスに PRIMARY を指定する。また、 AUTO_INCREMENT(画面の A_I のチェック) をONにする。この設定で、DBMSがテーブルにレコードを追加する際に自動で重複無しの番号を記録する。
「SQLのプレビュー」ボタンでテーブル作成コマンドの内容を確認できる。
「保存する」ボタンでテーブルを作成する。
主キーを設定し忘れた場合、以下の作業で主キーを設定
phpMyAdminのテーブル設定画面↓ではA_Iにチェックを入れるだけでインデックスがPRIMARYに設定される(主キーが設定される)。
先にPRIMARYを指定してからA_Iをチェックするとエラーになる。単にA_Iをセットするだけでよい。
テーブルの設定作業でのハマりポイント: 以下のようなミスに注意する。
テーブル設定を 保存 する際に発生するエラーの例)
主キーを設定せずにテーブルを保存しているので A_I 設定がうまくできない例)
↑の対処方法: 主キー を テーブルの 構造 画面の 鍵アイコン を押して設定する。 ↓の例)
テーブルの構造の修正をします。
students テーブルにフィールドを追加して拡張する。 フィールドの名前と型と属性は適切なものを選択する。
フィールドにデフォルト値を設定しておくとテーブルにレコード追加する際に自動的に値を設定できる。
例1)登録日の設定
フィールド名 registration_date
データ型 DATETIME
デフォルト値 CURRENT_TIMESTAMP システム(データベースサーバ)の現在時刻と日付を設定する関数
操作: テーブルの「構造」タブから 「1」個の カラムを追加する を 実行する。その後、追加するフィールド名やデータ型を設定する。
例2)学年 と クラス名 と 出席番号(名簿番号) を追加する。データ型の型名の後ろの(1)はデータ長(桁数、文字列長)を示す。
フィールド名 grade や class_name や number
データ型 INT(1) か VARCHAR(1) か INT(2)
デフォルト値 なし
上の例2では (学年、クラス名、出席番号) の組み合わせは学生名簿には1組しか登録できないと考えると、
言い換えると、学年とクラス名と出席番号を指定してテーブルを検索すると検索結果は 1名(登録済み) または 0名(未登録または不在)と考えると、
さらに言い換えると、複数の学生が見つかることは無いと考えると、
(学年、クラス名、出席番号)の組み合わせは 主キー として扱うことができる。これを 複合キー という。
(学年、クラス名、出席番号)を主キーとする場合、 id フィールドの主キーは候補キー(代替の主キー)として残しておいてもよいし、削除してもよい。
候補キーの例: ゲームのユーザアカウント登録で「ゲーマータグ(ユーザ名、他のユーザと重複無し)」「メールアドレス(他のユーザと重複無し)」が必要な場合、どちらも主キーとして利用できる(どちらも候補キー)。
ユニーク属性: テーブルのフィールドにユニーク属性を設定すると重複した値を記録できなくなる(重複禁止の設定)。主キーは元から重複不能なのでユニークに設定できない。1つのテーブルに複数の主キーは設定できないので、候補キーが複数ある場合はユニーク属性に設定してもよい。
以下の画像は、(grade, class_room, number)の組み合わせをユニーク属性に設定した例。
phpMyAdminの「テーブルの構造」タブでフィールドを複数選択して主キー(複合キー)やユニーク属性に設定できる。
(grade, class_room, number)を複合キーとして主キーにした場合、学年進行に伴い名簿を更新する作業は以下の様に面倒なものになる。
1.3年生は卒業したので削除
2.進級する1,2年生の学年を修正する。クラスを修正する。
3.新1年生を追加する
また入学者のクラス配属が決まるまでは学生名簿に新入生を記録できない(複合キーの一部を空欄にすることは出来ないので)。
テーブル設計を以下の様に変更すると卒業生を名簿から削除する必要は無くなり、クラス配属前の新入生を名簿に登録しておくこともできる。
学生名簿(○学生ID、入学年度、氏名、性別、・・・)
クラス履歴(○学生ID、○年度、学年、クラス、出席番号)
ここで、出席番号が名簿順で決まるならテーブルに記録する必要はない※。名前順に並べ替えて番号を振る処理をSQLで行えばよい。
学生の在籍状況を記載するテーブルを追加すれば、入学、進級、留年、休学、復学、退学などの履歴を管理できる。
※その場合、名簿に追加や欠員ができた場合には出席番号の修正が発生することになる。
さらにgroupsテーブルとstudent_groupテーブルをデータベースに追加します。
2017年版
【注意】テーブル名やフィールド名の単語の間はアンダーバー _ で接続する。空白を開けないこと。
テーブル名 groups
フィールド名 group_id タイプ A_I 主キー(A_Iの設定と同時にPRIMARYになる) データ型 INT
フィールド名 group_name データ型 VARCHAR(20)
テーブル名 student_group
フィールド名 student_id タイプなどは後で設定
フィールド名 group_id タイプなどは後で設定
主キーは設定しない。このテーブルには複合キーを演習5/5で設定する。
確認:ここまでで作成したテーブルは3つ。
students
groups
student_group
これから3個のテーブルそれぞれにレコードを数件ずつ追加する。
phpMyAdminの「挿入」タブから以下のように値を入力する。
studentsテーブルのidは空欄にして値を入力しない
groupsテーブルのgroup_idも同様に空欄のままでOK
まず、 students テーブルにレコードを数件追加する。
次に、groups テーブルにレコードを数件追加する。
最後に student_group にレコードを数件追加する。
この時students と groups テーブルに存在する id 番号を表示して確認して入力すること(学籍番号ではない)。
このテーブルの記録で学生が特定のグループに所属したことを表現する。
student_groupの入力内容に不整合が起きないように注意すること。
例)
既に所属済みのグループに繰り返して登録することはできない
未登録のグループのgroup_idや学生の idを登録することもできない
studentsテーブルのレコードの例
id 3番の学生のtelフィールドが空欄になっている。このテーブル構造ではNULLは許可していない。空白文字列が入力されている。
groupsテーブルのレコードの例
student_groupテーブルのレコードの例
トラブル対応が必要な場合
データベースのテーブルで主キーが未設定の場合、レコードを個別に1件ずつ操作する手段はない。不整合なデータや重複データを解消するにはテーブルのレコードを全件削除して対処する。
以下の操作画面からテーブルのレコードを全件消去できる。
student_group テーブルに 複合キーによる主キー (group_id と student_id の組み合わせを主キーとする)を設定する。
・方法1(簡易)
主キーを設定したstudent_groupテーブルを表示すると、レコードを個別に編集や削除できるようになっている。
・方法2(別の操作方法)
方法1の操作では以下の処理を一括して自動で行っています。
方法2では主キー用のインデックスがテータベース中に作成されていることがわかります。
インデックスのメニューを表示する。
開いたメニューの中の、
【1 】つのカラムにインデックスを作成する → 2 つに修正
実行 を押す。
つづけて、
インデックスの種類は PRIMARY (主キー。重複なし)
補足: 主キーを設定すると テーブルに インデックス が設定される。PHPMyAdminのテーブルの構造画面を確認すると 主キー PRIMARY のインデックスは BTREE (バランスツリー)で作成されている。バランスツリーについては データ構造とアルゴリズムなど他の科目を参考にして下さい。
データベースmytest学籍番号の 3つのテーブル
students
groups
student_group
の
構造 各テーブル
と
レコード 各テーブル
がわかるように、画面のスクリーンショットを撮って、WebClass の 第3回課題 問1 としてアップロードする
ブラウザのタブを複製し(タブを右クリック)、ウインドウを複数画面に並べて、1枚のスクリーンショットに収めて提出する
今回の演習で作成した3つのテーブルの構造を以下の回答書式でWebClass の 第3回課題 問2 に回答する
テーブルは以下の順で記入すること
students
groups
student_group
回答書式:
テーブル名に続けてフィールド名をカンマか「、」で区切って()で括る
主キーのフィールド名の先頭に ○ (WIndows:まる と入力して変換)を付ける
外部キーには先頭に※(WIndows:こめ と入力して変換)を付ける
主キーかつ外部キーのフィールド名には ○※フィールド名 と両方の記号を付ける
例)
天候記録テーブル(〇ID、日時、※地区ID、※天候ID、気温)
天候テーブル(〇天候ID、名称、記号)
地区テーブル(〇地区ID、地区名)
例)
利用記録テーブル(〇ID、日時、※教室ID、※団体ID、利用人数)
教室テーブル(〇教室ID、教室名、座席数、管理責任者)
団体テーブル(〇団体ID、団体名、代表者名)
例)
使用許可テーブル(〇※施設ID、〇※団体ID)
施設テーブル(〇施設ID、施設名、管理責任者)
団体テーブル(〇団体ID、団体名、代表者名)
第4回 テーブル設計: テーブルの正規化について第1正規形、第2正規形、第3正規形まで学ぶ。 正規化の演習を行う。
キーワード: 正規化 主キー 外部参照