LoginSignup
1
0

DBのテーブルでNOT NULL制約が課された列項目であっても、クエリ処理結果がNULLになる例

Last updated at Posted at 2023-12-11

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になる例を示しました。

1
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0