7: テーブル構造を変更する
テーブルのデザインを変更するSQLステートメントはいくつかある。この種の作業はデータを破壊する可能性があるため、常に注意して行う必要がある。たとえば、あるカラムのデータ型を変更した場合、そのカラムの新しいデータ型に合わせるために、エンジンが既存のデータの切り捨てや削除を行う可能性もある。テーブルの変更は、以下の制約を念頭に置きながら行うべきだ。
- 既存のカラムにすでにデータが入っている場合、そのカラムのデータ型をCOUNTERに変更することはできない。
- カラムの名前を変更することはできない。新しい名前のカラムを使うには、そのカラムを削除し、新たな名前のカラムを作成する必要がある。その際データを維持するには、新しいカラムを作成し、元のカラムからそのカラムにUPDATEを用いてデータをコピーし、元のカラムを削除すればよい。
- ALTER TABLEを用いてテーブルを変更する前に、そのテーブルを閉じること。この作業を行わない場合、エンジンがエラーを返す。次のVBAのコードは、開いているテーブルを閉じ、テーブルが開いている場合に起きるエラーを防ぐものだ。
On Error Resume Next DoCmd.Close acTable, table On Error GoTo 0
8: SQLの問題児、INSERT INTO
SQLのINSERT INTOステートメントは、既存のテーブルに新しいデータを追加するものだ。正しく使われればINSERT INTOはよい働きをするが、覚えておくべき重要なことが1つある。テーブルのデザインは一致する必要はないが、この作業の既存のテーブルの作業対象のカラムと追加されるデータのカラムが一致しなくてはならない。すなわち、新しいデータを追加される方のテーブルには、追加されるデータと同じカラムが存在する必要があるということだ。
次のように、VALUES句を使用して、追加するレコードのそれぞれのカラムの値を明示的に指定することもできる。
INSERT INTO targetcol1, col2, col3, ...) VALUES(value1, value2, value3, ...)
ただし、この構文では1度に1つのレコードしか追加できないため、使用できる場面は限られる。対象のすべてのカラムに対して値を指定する場合には、カラム名を省略できる。カラム名を指定する際には、その順序はテーブルに定義されている順序と合っていなくてはならない。主キーがオートナンバー型のカラムでない場合、主キーカラムが含まれている必要がある。主キーがオートナンバー型カラムである場合は、このカラムが含まれている必要はない。
9: UPDATEを使って値を削除する
SQLのDELTEステートメントはレコード全体を削除するものだ。カラムのリストを指定した場合、このステートメントはエラーを返さず、単にそのリストを無視する。たとえば、次のステートメントは、Employeesという名前のテーブルからすべてのデータを削除する。
DELETE FROM Employees DELETE Employees.* FROM Employees DELETE Employees.Salary FROM Employees
最後の構文では、Salaryというカラムを指定しているが、SQLはSalaryの値だけでなくすべてのデータを削除する。特定の値だけを削除する場合、次のような形でSQLのUPDATEステートメントを使う。
UPDATE source SET source.column = Null [WHERE condition]
ただし、カラムのプロパティとの衝突がある場合、このステートメントはエラーを返す。たとえば、もしそのカラムにデータが必要な場合は、Null値は受け入れない。