Oracle の 5 種類の制約: 一意制約、主キー制約、外部キー制約、非 null 制約、チェック制約

学生テーブルを作成する

create table student (
/*
约束设置格式:constraint 约束名称 约束类型(字段名).其中约束名称可以随便起,不起的话系统会
赋予一个名字(比如去掉constraint PK_student),PK开头是表示primary key缩写,表示主键约束。
*/
    student_number  number(10) constraint PK_student primary key, 
    student_name    varchar2(10) NOT NULL,
    student_identity_card  varchar2(20) constraint UN_student_identity_card unique,
    student_gender  varchar2(4),
    student_class   varchar2(10)
//也可以把约束放在这里  constraint PK_student primary key(student_number)
)

        私の意見では、一意制約はデータの一部を識別するために使用されます。データの一部は、特定のテーブルの特定のフィールドに対応するデータを指しますたとえば、上記のテーブル作成ステートメントでは、学生 ID 番号が同じ状況になることは不可能であるため、フィールド Student_identity_card に一意制約を設定しました。そのため、学生 ID 番号を格納するフィールドは 2 つの同じ値を持つことができません。この状況を効果的に防ぐことができます。

        たとえば、学生 ID 番号を含む別のデータがあり、このテーブルのデータを先ほど作成した学生テーブルに挿入すると、student_identity_card が存在するというエラーが報告されます。 , 戻って間違ったデータを見つけて、エラーに基づいて修正することができるので、この種のエラーは防ぐことができると言っています。

        さらに、一意制約操作フィールドの値が空であるため、null を格納でき、テーブルに複数の一意制約を設定できます。

        私の意見では、主キー制約 (主キー) はデータのセット (1 行) を識別するために使用されます。データのセットはテーブル内のデータの行を指します主キー制約 = 一意制約 + 非 null 制約。つまり、主キー制約が設定されているフィールドのデータは一意であり、空ではありません。

        別の例を見てみましょう。上で作成した Student テーブルでは、student_number とstudent_identity_card の両方を使用して、student テーブル内のデータ セットを一意に識別できます。つまり、誰でもこれら 2 つのフィールドを主キーとして使用できます。もちろん、論理的には、学生情報テーブルを識別するために xue.number を使用することを推奨します。実際、この一意性制約フィールドは主キーとして使用できますが、主キーを空にすることはできないことを考慮する必要があります。

        学生の科目を表すために、student_subject フィールドを学生テーブルに追加しました (全員が中国語、数学、英語を勉強している場合)。学生番号に基づいて学生情報を確認することで、各学生が 3 つの情報セットを持っていることがわかります。 ID 番号、これら 2 つのフィールドはデータのセットを一意に識別できず、主キーとして使用できません。そして、学籍番号+科目、またはID番号+科目をグループとして捉え、一組のデータを一意に識別できるようにします

        もちろん、主キーに複数のフィールドが含まれている場合、複数の主キーがあるとは言えず、これらのフィールドが一緒になって主キーを形成するはずです。

        外部キー制約は、2 つのテーブルのデータ間の関係を表現するために使用されます一方のテーブル (マスター テーブル) の主キー フィールドを別のテーブル (スレーブ テーブル) に追加し、2 つのテーブル間に制約関係を作成します。これらのフィールドは次のようになります。 2 番目のテーブルへの外部キー。

        外部キー制約を設定すると、次のような影響が生じます (注: 以下の変更されたデータはすべて、デフォルトで変更された 2 つのテーブルと外部キー制約のフィールドに関連しています!!!!!! )。

 (1) スレーブテーブルのデータを変更します。

        a. テーブルからデータを挿入または変更する場合、外部キーの値がメインテーブルの主キーの値の範囲内にない場合、エラーが発生します。つまり、スレーブ テーブルのデータはマスター テーブルにも存在する必要があります

(2) メインテーブルのデータを変更します。

        a. マスターテーブルのデータを削除または変更する場合、変更または削除されたデータがスレーブテーブルにも存在する場合、エラーが報告されます。外部キーを作成するときに定義しない限り、次のようになります。

        マスター テーブル内のデータを削除すると、スレーブ テーブル内の対応するデータが同期的に (削除カスケードで) 削除されます。

        マスター テーブル内のデータを削除すると、スレーブ テーブル内の対応するデータが同期的に null に設定されます (on delete set null)。

create table student_score {
    student_number varchar2(10),
    student_name   varchar(10),
    subject        varchar2(20),
    score          varchar2(4),
    foreign key(student_number) references student(student_number)
/*
后面可以跟:
    1、on delete cascade(主表删除数据,从表同步删除对应数据)
    2、on delete set null(主表删除数据,从表同步设置相应数据值为null)
    3、on update cascade(主表修改数据,从表同步修改对应对应数据)
    4、on update set null(主表修改数据,从表同步设置相应数据值为null)
*/
};

on update 和 on delete  后面可以跟的词语有四个
no action  , set null ,  set default  ,cascade
no action 表示 不做任何操作,
set null    表示在外键表中将相应字段设置为null
set default 表示设置为默认值

-----------------------------------------------------------
对于已经创建好的表也可以这样增加外键约束:
alter table student_score 
    add constraint 约束名称 foreign key(student_number) references student(student_number)
    on delete或者update ....
-----------------------------------------------------------
除了外键,其他约束的删除、禁用、启用都可以
删除外键:
alter table student_score drop constraint 约束名称

禁用外键:
alter table student_score disable constraint 约束名称

启用外键:
alter table student_score enable constraint 约束名称

        さらに、Oracle のすべての制約の関連情報は user_constraints テーブルにあります。Constraint_type='R' は外部キーです。このテーブルから制約名を見つけることができます。

        これらの記事も参照できます。これらのブログは非常によく書かれています。

Oracle の主キーと外部キー - プログラマーが求めたもの

Oracle 外部キー--詳細_Luxury 高級住宅ブログ-CSDN blog_oracle 外部キー

        非 null 制約は文字通り、制限されたフィールドの値が空ではないことを意味します。上記の Student テーブルの Student_name フィールドを参照してください。

        CHECK 制約は、テーブルの列に追加の制約を追加することを指します。CHECK 制約を使用する場合は、次の 3 つの点に注意してください。

        1. CHECK 制約はビュー内で定義できません。

        2. CHECK 制約は、指定されたテーブルに含める必要がある列のみを定義できます。

        3. CHECK 制約にはサブクエリを含めることはできません。

以下に CHECK 制約の例をいくつか示します。

create table student_socore{
    student_number varchar2(10) constraint 约束名称 CHECK(length(student_number) = 8,
    student_name   varchar(10),
    subject        varchar2(20) constraints 约束名称 CHECK(subject in ('语文','数学','外语')),

//这里注意字段类型,varchar2是不能直接比大小的,number型可以
    score          number(4) constraints 约束名称 CHECK(number >= 0 and number <= 150)
};

おすすめ

転載: blog.csdn.net/qq_54381110/article/details/125349025
おすすめ