テーブルと列の制約により、データ品質を強制できます。 SQLでは、テーブルに制約を作成する方法が2つあります。インライン およびライン外 。
この記事では、これらの制約とその利点を探り、推奨するものとその理由を説明します。
インライン制約とは何ですか?
インライン制約は、テーブルを作成するときに列と同じ行で宣言する制約です。
CREATE TABLE employee ( emp_id NUMBER(10) PRIMARY KEY, first_name VARCHAR2(200), last_name VARCHAR2(200), dept_id NUMBER(10) );
この例では、emp_id列の後のPRIMARY KEYという単語は、emp_idが主キーであることを示しています。
したがって、キーワードを追加することにより、この列に主キー制約を作成しました。概念は、制約の種類に関係なく同じです。
アウトオブライン制約とは何ですか?
アウトオブライン制約は、列の別の行で宣言された制約です。 CREATETABLEステートメントの最後に追加します。
たとえば、次のスクリプトがあります。
CREATE TABLE employee ( emp_id NUMBER(10), first_name VARCHAR2(200), last_name VARCHAR2(200), dept_id NUMBER(10), CONSTRAINT pk_emp PRIMARY KEY (emp_id) );
ご覧のとおり、 pk_empと呼ばれるPRIMARYKEY制約を設定します。 、ステートメントの最後のemp_id列に。
この概念は、制約の種類に関係なく同じように機能します。
次に、宣言されている場所を除いて、これら2つのタイプの制約の違いを分析しましょう。
アウトオブライン制約には名前を指定できます
アウトオブライン制約を作成するときに、名前を指定できます。これは時間の無駄に思えるかもしれませんが、役立つ場合があります。
特定の例でこれを検討してください:
CREATE TABLE employee ( emp_id NUMBER(10), first_name VARCHAR2(200), last_name VARCHAR2(200), dept_id NUMBER(10), CONSTRAINT pk_emp PRIMARY KEY (emp_id), CONSTRAINT fk_emp_deptid FOREIGN KEY (dept_id) REFERENCES department (dept_id), CONSTRAINT ck_emp_lnlen CHECK (LENGTH(last_name) > 3) );
いくつかの制約について、次の名前を指定しました。
- pk_emp
- fk_emp_deptid
- ck_emp_lnlen
不必要なタイピングのように見えるかもしれませんが、そうではありません。これについて詳しく見ていきます。
では、なぜ制約に名前を割り当てる必要があるのでしょうか?
名前付き制約があると、いくつかの状況で役立ちます。名前を指定しない場合、Oracleは、すべてのインライン制約に対して行う制約の名前を自動的に生成します。通常、この名前は有用な情報を提供しません。
SQL文、PL / SQLコード、またはアプリケーション・コードでエラーが発生した場合は、制約名を使用して、それが何を参照しているかを知るか、少なくとも推測することをお勧めします。 pk_empなどの名前 またはck_emp_lnlen 一般的なEMP1290894FHよりも説明的です 名前。
また、実行プランを確認する場合、出力で制約名がよく使用されます。これにより、プランがどのように実行されているかを簡単に把握できます。特に、主キーと外部キーのどちらが使用されているかを判断する場合があります。
NOTNULL制約はインラインでのみ宣言できます
インライン制約として宣言できる制約タイプは1つだけです。これはNOTNULL制約です。
これは、ライン外として宣言できないことを意味します。
次のコードを実行します:
CREATE TABLE employee ( emp_id NUMBER(10), first_name VARCHAR2(200), last_name VARCHAR2(200) NOT NULL, dept_id NUMBER(10) );
ただし、以下のコードを実行すると、機能しないことがわかります。
CREATE TABLE employee ( emp_id NUMBER(10), first_name VARCHAR2(200), last_name VARCHAR2(200), dept_id NUMBER(10), CONSTRAINT nn_emp_ln NOT NULL (last_name) );
要約すると、NOT NULL制約の場合、それらをインラインで宣言する必要があります。
CHECK制約は複数の列を参照できます
CHECKインライン制約を作成する場合、それは作成されている列のみを参照できます。
ただし、行外としてCHECK制約を作成すると、複数の列を参照する可能性があります。
従業員を作成します 以下に示すように、CHECK制約のあるテーブル:
CREATE TABLE employee ( emp_id NUMBER(10), first_name VARCHAR2(200) CHECK (LENGTH(first_name) > 10), last_name VARCHAR2(200), dept_id NUMBER(10) );
この制約は、first_nameの長さが10文字を超えている必要があることを示しています。
ただし、組み合わせを指定したい場合はどうでしょうか。 名と名前の名前は10文字を超える必要がありますか?
これを行うには、コードをアウトオブライン制約として書き直します。
CREATE TABLE employee ( emp_id NUMBER(10), first_name VARCHAR2(200),, last_name VARCHAR2(200), dept_id NUMBER(10), CONSTRAINT ck_fullname_len CHECK (LENGTH(first_name || last_name) > 10) );
このルールは、アウトオブライン制約を使用してのみ実装できることがわかります。
推奨される方法
インラインまたはアウトオブラインの両方の方法を分析したので、アウトオブライン制約を使用することをお勧めします。
これにはいくつかの理由があります。
まず、制約の名前を指定して、エラーメッセージと内部実行計画でそれらを確認できます。また、制約の無効化と有効化にも役立ちます。
次に、チェック制約を使用すると、複数の単一の列を参照できます。したがって、それらをアウトオブライン制約として追加すると、より柔軟になります。
最後に、すべての制約を行外として宣言すると(インライン制約としてのみ定義できるNOT NULLを除く)、CREATE TABLE構文を確認し、すべての制約を1か所で確認するのが簡単になります。特に、制約の多い大きなテーブルがある場合に重要です。
結論として、インラインとアウトオブラインの2つの異なる方法を使用して制約を作成できます。柔軟性が高く、制約に名前を設定して、実行プランやその他のSQL情報の分析を簡素化できるため、可能な限りオフライン方式を使用することをお勧めします。