MySQLの外部キー(FOREIGN KEY)で結ばれた2つのテーブル間で、データ整合性が子テーブル側でも維持される仕組みとは
外部キーによる参照整合性の自動的な維持
実際のところ、外部キー(FOREIGN KEY)は「参照整合性」を強制する仕組みであり、これによってデータの一貫性と整合性を自動的に保つことができます。この動作は、「customer(顧客)」と「orders(注文)」という2つのテーブルを例にすると分かりやすくなります。ここでは「customer」が親テーブル、「orders」が子テーブルです。存在しない顧客に対しては注文を作成できないというルールが、外部キーによって強制されます。
まず、両テーブルの中身を確認してみましょう。
mysql> Select * from Customer; +----+--------+ | id | name | +----+--------+ | 1 | Gaurav | | 2 | Raman | | 3 | Harshit| | 4 | Aarav | +----+--------+ 4 rows in set (0.00 sec) mysql> Select * from orders; +-----------+-------------+------+ | order_id | product | id | +-----------+-------------+------+ | 100 | Notebook | 1 | | 110 | Pen | 1 | | 120 | Book | 2 | | 130 | Charts | 2 | +-----------+-------------+------+ 4 rows in set (0.00 sec)
この状態で、存在しない顧客(customerテーブルにはid 10は存在しない)に対してordersテーブルへ値を挿入しようとすると、外部キー制約の検証に失敗し、MySQLは以下のようなエラーを返します。
mysql> insert into orders values(400, 'Notebook',10); ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`query`.`orders`, CONSTRAINT `orders_ibfk_1` FOREIGN KEY (`id`) REFERENCES `customer` (`id`))
エラーの意味
この ERROR 1452 は、「子テーブルに行を追加または更新できません:外部キー制約に違反しています」という意味です。つまり、ordersテーブルの id 列には、親テーブルであるcustomerの id 列に実在する値しか格納できないようになっています。
まとめ
このように、外部キー制約が設定された子テーブルでは、親テーブルに存在しない参照先の値を持つ行を挿入・更新しようとした時点で、データベース側が自動的に拒否してくれます。アプリケーション側でチェックしなくても、不正なデータ(孤立した注文データなど)が混入するのを防げるため、データ整合性が確実に維持されていると言えるのです。
-
【MySQL】テーブルの動的データを活用するストアド関数の作成方法
MySQLストアド関数とテーブル参照の基本ルールMySQLのストアド関数はテーブルを参照することができますが、結果セットを返すステートメントを使用することはできません。つまり、通常のSELECTクエリのように結果一覧を出力する処理は関数内に記述できないという制限があります。この制限を回避するために活用できるのが「SELECT INTO」構文です。SELECT INTOを使えば、テーブルから取得した値を変数へ格納でき、その後関数内で自由に計算や加工を行うことができます。サンプルデータの準備ここでは、学生ごとの各教科の点数を管理する「Student_marks」テーブルを使用します。以下のようなレ
-
MySQLでテーブルの最大IDに関連付けられたデータを取得する方法
最大値のレコードを取得する基本的な考え方MySQLのテーブルから最も大きい値(最大ID)を持つレコードを取得したい場合は、ORDER BYで降順(DESC)に並べ替え、LIMITで先頭の行だけを取り出すのが定番の手法です。select *from yourTableName order by yourColumnName DESC LIMIT 1;なお、「LIMIT 1,1」と指定すると先頭の1行を読み飛ばして次の行を取得するため、結果として2番目に大きい値が返ります。「最大値そのもの」なのか「2番目に大きい値」なのか、目的に応じて使い分けましょう。サンプルテーブルの作成まずは動作確認用のテー