ExcelでRDB(リレーショナルデータベース)を操作してみようという連載のその24です。前回の記事はこちらです。
データベースの制約
前回は入力規制に対応しました。これで多少は使いやすくなったと思います。
今回はデータベースに設定される制約について対応しようと思います。でも、制約って何なんでしょうか? ここで言うところの制約とは、データベースに入力されるデータに制約条件を付けることです。今回は、以下の制約について取り上げます。
- NOT NULL制約
NULLとは、データが何も入っていない空の状態です。NOT NULL制約を指定すると、そのカラムはNULLの状態が禁止されます。
- 一意制約
データベースの指定したカラムに同じデータが複数あってはならない(一意と言う)制約です。
実をいいますと、主キーに設定されたカラムは自動的に一意制約とNOT NUll制約が設定されます。これを主キー制約と言ったりします。今回は、データを入力して登録する際に主キーについて内容を確認して2つの制約が守られているか確認するようにしたいと思います。
機能の実現方法
機能の実現方法ですが、登録ボタンが押された際に主キーの項目について以下の処理を追加すればいいいと思います。
NOT NULL制約 ⇒ 登録時にデータが入力されているかを確認する。
一意制約 ⇒ 登録時に指定された値がデータベースに入力されていないかSQLで検索する。
コードを書いてみましょう。
'データ登録を実行します Public Sub cmdDataEntry_Click() Dim inputData() As Variant Dim i As Long If MsgBox("データを登録します", vbYesNo) = vbNo Then Exit Sub Dim db As New clsAccessDbase db.dbFileName = Me.Range("FileName").Value db.dbTableName = Me.Range("TableName").Value '登録データを設定します ReDim inputData(UBound(db.dbFieldList)) For i = 0 To UBound(inputData) With Me.Range("columnList") '主キーの制約を確認します。 If .Offset(1 + i, 2) = "主キー" Then If .Offset(1 + i, 3) = "" Then MsgBox "主キーが指定されていません" Exit Sub End If Dim sqlCmd As String sqlCmd = .Offset(1 + i, 0) & " = " & .Offset(1 + i, 3) If db.SelectRecord(sqlCmd) <> 0 Then MsgBox "主キーがユニークではありません" Exit Sub End If End If inputData(i) = .Offset(1 + i, 3) End With Next 'データを登録します db.AddRecord inputData Me.Range("RecordCount").Value = db.dbRecordCount MsgBox "データを登録しました" End Sub
主キーが指定されていない場合は「主キーが指定されていません」となって登録作業を中断します(NOT NULL制約)。また、SQLで検索して過去に登録されている値であった場合には「主キーがユニークではありません」となって登録作業を中断します(一意制約)。クラスモジュールのSelectRecordメソッドを使うと、WHERE句で指定した条件で検索した結果のレコード数を返しますので、この機能を使用しています。
動かしてみる
主キーが設定されているファイルを使って動作確認してみましょう。主キーを設定してあるサンプルファイルを用意しました。ので開いてデータ入力してみます。
最初に主キーに1を設定してデータを入力してから、主キーを空欄にして登録してみると・・・
次に主キーを1にしてデータ登録しようとすると・・・
主キーを2にして登録してみると・・・
ちゃんと登録できました!!
今回のプログラムとサンプルファイルは、以下からダウンロードできます。興味のある人は試してみてください。(サンプルなので実務には使用しないでください!!)
次回は外部キー制約
いかがでしょうか?これでちょっと本格的になってきたと思います。実を言うと他にも外部キー制約というものがあります。他のテーブルのキーを参照しているカラムに設定する制約です。次回はそちらに取り組んでみようと思います。お楽しみに!!