Oracle の制約は主に、ビジネス ロジック レベルでデータの整合性を維持することです。主にプログラマがアプリケーションで制約を指定するか、トリガーを定義してデータの整合性を維持します。最後に、Oracle 独自の制約を使用してデータの整合性を維持します。 Oracle 独自の制約を使用して要件を満たすことができる場合は、Oracle 独自の制約を使用するようにしてください。トリガーなどのユーザー定義の制約の使用はデータベースのパフォーマンスに影響を与えるためです。たとえば、トリガーを使用すると、テーブルがロックされ、テーブル スキャンまたはインデックス スキャンが実行され、データベースのパフォーマンスと同時実行性が低下します。
Oracle の制約は主に次のタイプに分類されます。
not null 非 null 制約、unique unique 制約、主キー主キー制約、外部キー外部キー制約、チェック制約。
not null 非 null 制約:
作成方法: 1. テーブル作成時に列レベルで定義する(つまり、テーブル定義時に列の後に制約の定義しか書けない)、2つの方法。 1 つはカスタム制約名を使用し、もう 1 つはシステムのデフォルト名を使用します。
プレーンコピーをクリップボードプリントに表示しますか?
テーブルを作成します
(
tid 番号(8) 制約 NK_t1 が null ではありません。
tname varchar2(10) が null ではありません
)
テーブルを作成します
(
tid 番号(8) 制約 NK_t1 が null ではありません。
tname varchar2(10) が null ではありません
)
プレーンコピーをクリップボードプリントに表示しますか?
SQL> select t.constraint_name、t.table_name、t.status、t.deferrable from user_constraints t;
CONSTRAINT_NAME TABLE_NAME ステータスが延期可能
-------------------------------------------------- ----------------------
NK_T1 T 有効、延期不可
SYS_C003735 有効ではありません 延期できません
SQL>
SQL> select t.constraint_name、t.table_name、t.status、t.deferrable from user_constraints t;
CONSTRAINT_NAME TABLE_NAME ステータスが延期可能
-------------------------------------------------- ----------------------
NK_T1 T 有効、延期不可
SYS_C003735 有効ではありません 延期できません
SQL>
2. テーブルの作成後に変更しますが、テーブル内のデータが制約に違反していないことを確認してください。
プレーンコピーをクリップボードプリントに表示しますか?
SQL> alter table tmodify tid not null;
テーブルが変更されました
SQL> select t.constraint_name、t.table_name、t.status、t.deferrable from user_constraints t;
CONSTRAINT_NAME TABLE_NAME ステータスが延期可能
-------------------------------------------------- ----------------------
SYS_C003736 有効ではありません 延期できません
SQL>
SQL> alter table tmodify tid not null;
テーブルが変更されました
SQL> select t.constraint_name、t.table_name、t.status、t.deferrable from user_constraints t;
CONSTRAINT_NAME TABLE_NAME ステータスが延期可能
-------------------------------------------------- ----------------------
SYS_C003736 有効ではありません 延期できません
SQL>
制約をチェックする
作成方法:テーブルレベル、カラムレベルで定義可能(カラムの後に定義しても、カラムの定義後に定義してもよい)。定義方法も 2 通りあります。
プレーンコピーをクリップボードプリントに表示しますか?
SQL> テーブルを作成します
2 (
3 tid 番号(8) 、
4 tname varchar2(10)、
5 制約 CK_T1 チェック ((tid が null ではない) および (tid > 0))
6)
7/
テーブルが作成されました
SQL> alter table t add制約CK_T2 check(tnameがnullではありません);
テーブルが変更されました
SQL> select t.constraint_name、t.table_name、t.status、t.deferrable from user_constraints t;
CONSTRAINT_NAME TABLE_NAME ステータスが延期可能
-------------------------------------------------- ----------------------
CK_T1 T 有効化は延期できません
CK_T2 T 有効化は延期できません
SQL>
SQL> テーブルを作成します
2 (
3 tid 番号(8) 、
4 tname varchar2(10)、
5 制約 CK_T1 チェック ((tid が null ではない) および (tid > 0))
6)
7/
テーブルが作成されました
SQL> alter table t add制約CK_T2 check(tnameがnullではありません);
テーブルが変更されました
SQL> select t.constraint_name、t.table_name、t.status、t.deferrable from user_constraints t;
CONSTRAINT_NAME TABLE_NAME ステータスが延期可能
-------------------------------------------------- ----------------------
CK_T1 T 有効化は延期できません
CK_T2 T 有効化は延期できません
SQL>
制約 CK_T1 は、tid 列を空にすることができず、0 より大きいことを保証し、CK_T2 は、iname を空にすることができないことを保証します。チェック制約は、同じ行の異なる列間のルールにすることもできます。
一意の制約
作成方法: 一意の列に列が 1 つだけ含まれている場合は、列レベルで定義できます。一意の列に複数の列が含まれている場合は、テーブル レベルでのみ定義できます。
プレーンコピーをクリップボードプリントに表示しますか?
SQL> テーブル t2 を作成
2 (
3 vid 番号制約 VK_T1 固有、
4 vname varchar2(10)、
5 vsex varchar2(10)、
6 制約 VK_T2 unique(vname,vsex)
7)
8/
テーブルが作成されました
SQL> select t.constraint_name、t.table_name、t.status、t.validated、t.deferrable from user_constraints t;
CONSTRAINT_NAME TABLE_NAME ステータス検証済み 遅延可能
---------- ---------- -------- ---------- ------- -------
VK_T1 T2 有効 検証済み 延期不可
VK_T2 T2 有効、検証済み、延期不可
SQL>
SQL> テーブル t2 を作成
2 (
3 vid 番号制約 VK_T1 固有、
4 vname varchar2(10)、
5 vsex varchar2(10)、
6 制約 VK_T2 unique(vname,vsex)
7)
8/
テーブルが作成されました
SQL> select t.constraint_name、t.table_name、t.status、t.validated、t.deferrable from user_constraints t;
CONSTRAINT_NAME TABLE_NAME ステータス検証済み 遅延可能
---------- ---------- -------- ---------- ------- -------
VK_T1 T2 有効 検証済み 延期不可
VK_T2 T2 有効、検証済み、延期不可
SQL>
一意制約が作成されると、インデックスが生成されます (一意のインデックスである場合もあるため、テーブルの作成時にテーブルが指定されているかどうかに応じて、一意でないインデックスになる場合もあります)。データが挿入されます):
プレーンコピーをクリップボードプリントに表示しますか?
SQL> select t.index_name、t.table_name、t.uniqueness from user_indexes t;
INDEX_NAME TABLE_NAMEの一意性
---------- ---------- ----------
VK_T1 T2 ユニーク
VK_T2 T2 ユニーク
SQL> select t.index_name、t.table_name、t.uniqueness from user_indexes t;
INDEX_NAME TABLE_NAMEの一意性
---------- ---------- ----------
VK_T1 T2 ユニーク
VK_T2 T2 ユニーク
インデックスがあるため、テーブルの作成時にインデックスの保存場所といくつかの保存パラメーターを指定できます。
プレーンコピーをクリップボードプリントに表示しますか?
SQL> テーブル t2 を作成
2 (
3 vid 番号制約 VK_T1 固有、
4 vname varchar2(10)、
5 vsex varchar2(10)、
6 制約 VK_T2 unique(vname,vsex) インデックス表領域 indx を使用
7 ストレージ (最初の 100k、次の 100k 増加 0)
8 ロギングなし
9)
10/
テーブルが作成されました
SQL> テーブル t2 を作成
2 (
3 vid 番号制約 VK_T1 固有、
4 vname varchar2(10)、
5 vsex varchar2(10)、
6 制約 VK_T2 unique(vname,vsex) インデックス表領域 indx を使用
7 ストレージ (最初の 100k、次の 100k 増加 0)
8 ロギングなし
9)
10/
テーブルが作成されました
制約付きインデックスが格納される表スペースは indx 表スペースで、初期ブロック サイズは 100k で、DML 操作のログは生成されません (ただし、他の理由でもログは生成されますが、ログの数はデフォルトのロギングよりも少なくなります)。
主キー 主キー制約
作成方法:主キーは主に非nullと一意性で構成されます。テーブルには主キーを 1 つだけ含めることができますが、主キーには複数の列を含めることができます。
プレーンコピーをクリップボードプリントに表示しますか?
SQL> テーブル t2 を作成
2 (
3 vid 番号制約 VK_T1 固有、
4 vname varchar2(10)、
5 vsex varchar2(10)、
6 インデックステーブルスペースインデックスを使用した制約 VK_T2 主キー (vname,vsex)
7 ストレージ (最初の 100k、次の 100k 増加 0)
8 ロギングなし
9)
10/
テーブルが作成されました
SQL> テーブル t2 を作成
2 (
3 vid 番号制約 VK_T1 固有、
4 vname varchar2(10)、
5 vsex varchar2(10)、
6 インデックステーブルスペースインデックスを使用した制約 VK_T2 主キー (vname,vsex)
7 ストレージ (最初の 100k、次の 100k 増加 0)
8 ロギングなし
9)
10/
テーブルが作成されました
外部キー 外部キー
作成方法: 外部キーに関係するテーブルには 2 つまたは 1 つのテーブルを含めることができます。2 つのテーブルの場合、子テーブルのフィールドによって参照されるキーは、より太いテーブルの主キーである必要があります。制約は子テーブルで確立され、テーブルのフィールドの値が親テーブルに存在するか、NULL 値である必要があることを示します。
プレーンコピーをクリップボードプリントに表示しますか?
SQL>テーブル部門の作成
2 (
3 は数値 (8) を実行しました。
4 dname varchar2(20)、
5 制約 PK_DEPT 主キー (did)
6)
7/
テーブルが作成されました
SQL>
SQL> テーブル emp を作成
2 (
3 eid 数値(8) 主キー、
4 ename varchar2(20)、
5 は、number(8) /*references dept(did)*/ を実行しました。
6 dname varchar2(20)、
7 制約 FK_EMP2 外部キー(did) 参照 dept(did)
8)
9/
テーブルが作成されました
SQL>テーブル部門の作成
2 (
3 は数値 (8) を実行しました。
4 dname varchar2(20)、
5 制約 PK_DEPT 主キー (did)
6)
7/
テーブルが作成されました
SQL>
SQL> テーブル emp を作成
2 (
3 eid 数値(8) 主キー、
4 ename varchar2(20)、
5 は、number(8) /*references dept(did)*/ を実行しました。
6 dname varchar2(20)、
7 制約 FK_EMP2 外部キー(did) 参照 dept(did)
8)
9/
テーブルが作成されました
外部キー(外部キー)は参照キー(参照キー)によって決まるため、よりファターテーブルに対して更新、ドロップ、削除などの操作を行う場合には制限があります。具体的には、外部キー制約のステータスによって決まります。
アクション時の削除、カスケードの削除、null セットの削除
アクション時に削除がデフォルト設定です。より上位のテーブル内のデータを削除すると、Oracle はワード テーブルをロックしてからテーブルをスキャンし (外部キー列がある場合はインデックスをスキャンします)、データはテーブルに存在しなくなります。子テーブルの外部キー列の削除が許可されます。
delete cascade は、Word テーブル内の対応する行も削除します。
delete set null を実行すると、バーテーブルの外部キー列に対応するデータが NULL になります。
プレーンコピーをクリップボードプリントに表示しますか?
テーブルempを作成する
(
EID 番号 (8) 主キー、
ename varchar2(20)、
Did number(8) /*参照 dept(did)*/,
dname varchar2(20)、
制約 FK_EMP2 外部キー (did) は削除時に dept(did) を参照し、null を設定します
)
テーブルempを作成する
(
EID 番号 (8) 主キー、
ename varchar2(20)、
Did number(8) /*参照 dept(did)*/,
dname varchar2(20)、
制約 FK_EMP2 外部キー (did) は削除時に dept(did) を参照し、null を設定します
)