1. はじめに
単体テストケースを考える中で、DBのテーブルでNOT NULL制約が課された列項目であっても、クエリ処理結果がNULLになる例が存在することに気づきました。そのため、この記事ではクエリ処理として外部結合を例に紹介します。
2. 具体例の紹介
tableA
CREATE TABLE tableA (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL
);
INSERT INTO tableA (id, name) VALUES (1, 'John');
INSERT INTO tableA (id, name) VALUES (2, 'Jane');
tableB
CREATE TABLE tableB (
id INT PRIMARY KEY,
description VARCHAR(50)
);
INSERT INTO tableB (id, description) VALUES (1, 'Employee');
tableAとtableBをid列で外部結合してみましょう
ID列で外部結合
SELECT tableA.id, tableA.name, tableB.description
FROM tableA
LEFT JOIN tableB ON tableA.id = tableB.id;
| id | name | description |
|----|------|-------------|
| 1 | John | Employee |
| 2 | Jane | NULL |
この例では、tableAのすべての行が表示されていますが、tableBに対応する id が2の行が存在しないため、description 列には NULL が挿入されています。外部結合は、左側のテーブル(tableA)のすべての行を表示し、右側のテーブル(tableB)とのマッチングができる場合には対応する値を表示し、できない場合には NULL を表示するため、NOT NULL 制約があっても NULL が挿入される可能性があります。
このように、NOT NULL制約はDBのデータベースファイル上に存在する時にチェックされるものであり、クエリ処理結果までに制限を加えるものではありません。
3. おわりに
この記事では、単体テストケースを考える中での注目すべきポイントとして、DBのテーブルでNOT NULL制約が課された列項目であっても、クエリ処理結果がNULLになる例を示しました。