InterBase クイック スタート:Part III - データの削除
InterBase クイック スタート:Part III - データベースの中身の設定 へ戻る
テーブルからデータの行を 1 つまたは複数削除するには、DELETE
文を使用します。 シンプルな DELETE
は、次の構文になります:
DELETE FROM Table
WHERE CONDITION
UPDATE
のときと同様、WHERE
句に、削除する行を決定する検索条件を指定します。 検索条件は、サブクエリを使用して、組み合わせることができます。
DELETE
文には、WHERE
句は必須ではありません。 しかし、WHERE
句を含めない場合、テーブルの行 すべてを削除することになります。
Sales テーブルから行を削除する
- 次の
SELECT
文を入力して、1992 年よりも前の販売記録を確認します:SELECT * FROM Sales WHERE order_date < '31-DEC-1991'
得られる結果は、エントリを 1 つだけ含んでいるはずです。
- この時点までの作業をコミットしましょう。
- 次の
DELETE
文を入力します:DELETE FROM Sales WHERE order_date < '31-DEC-1991'
DELETE
文では、列指定がいらない点に注意してください。 この文は、指定した行のすべての列を削除するからです。 - ステップ 1 から、
SELECT
クエリを入力します。空の(行がない)結果を受け取るはずです。
ロールバックを使用して変更を元に戻す
最終的にはこのデータを削除するべきではなかったと気付いたとします。 幸いなことに、DELETE
文を実行する前に、作業をコミットしていましたので、最後のコミットの後に実行した変更はロールバック(元に戻す)ことができます。
- ロールバックを実行します。
- 再びステップ 1 から、
SELECT
クエリを入力します。 データを削除する前の同じ(1 行の)結果が確認できるはずです。
バックアップの時間です
このセクションを正常に終了できたら、データベースのバックアップを行う良いタイミングでしょう。
より精密な削除
削除操作は、検索条件を組み合わせることにより、さらに制御することができます。 たとえば、次の文は、1992年1月1日より前に雇用された、営業部の社員全員のレコードを削除します:
DELETE FROM Employee
WHERE job_code = 'Sales'
AND hire_date = '01-Jan-1992'
この文の実行を試すことはできますがエラーとなります。これは、Employee
テーブルを参照する外部キー列が Employee_project
テーブルにあるためです。これらの行を削除しようとすると、Employee
テーブルに一致する値がない値を Employee_project
テーブルに残すことになり、次のような外部キーの制約に違反することになります:「プロジェクトを持つ社員はいずれも、Employee
テーブルにエントリがなければならない」。
データの削除にはまた、更新のときと同様、サブクエリを使用することができます。 次の文は、Katherine Young
と同じ部署にいる社員について、Employee
テーブルからすべての行を削除します。
DELETE FROM Employee
WHERE dept_no = (SELECT dept_no
FROM Employee
WHERE full_name = 'Young, Katherine')
ここでも、他のテーブルへの外部キー制約違反になってしまうので、実際にはこの文を実行することはできません。