ホームページ > データベース > mysql チュートリアル > SQL 整合性制約とは何ですか?

SQL 整合性制約とは何ですか?

清浅
リリース: 2020-09-15 11:46:59
オリジナル
17231 人が閲覧しました

SQL 整合性制約には次のものが含まれます: 1. 「NOT NULL」非 null 制約、指定された列は null 値を持つことは許可されません; 2. 「UNIQUE」一意の制約、データ内に重複する値はありません。指定された列; 3. "PRIMARY" KEY" 主キー制約、テーブルの各行を一意に識別します; 4. "FOREIGN KEY" 外部キー制約; 5. "CHECK" 条件付き制約。

SQL 整合性制約とは何ですか?

整合性制約は、ユーザーによる変更によってデータの一貫性が損なわれないことを保証し、データの正確性と互換性を保護する手段です。

5 つの共通制約:

NOT NULL: 非 null 制約 C、指定された列は null 値を許可しません

UNIQUE: 一意制約 U、指定された列に重複する値がない、またはテーブル内の各値または値の各グループが一意になります

PRIMARY KEY: 主キー制約 P、主キー制約 P、各行を一意に識別しますテーブル、および NULL 値は許可されません。テーブルには主キー制約を 1 つだけ持つことができます。

FOREIGN KEY: 外部キー制約 R. 1 つのテーブルの列が他のテーブルの列を参照するため、依存関係が存在します。列

CHECK: 条件付き制約 C、列が特定の条件を満たすかどうかを指定します

非 null 制約 NK

create table member(
    mid number,    
    name varchar2(200) not null
    );
ログイン後にコピー

null 挿入エラー:

SQL> insert into member(mid,name) values(1,null);
*
第 1 行出现错误:
ORA-01400: 无法将 NULL 插入 ("SCOTT"."MEMBER"."NAME")
ログイン後にコピー

一意制約 UK

drop table member purge;create table member(
    mid number,
    name varchar2(200) not null,
    email varchar2(50) unique
    );
ログイン後にコピー

挿入エラー

SQL> insert into member(mid,name,email) values (1,'scott','scott@163.com');
ログイン後にコピー

1 行が作成されました。

SQL> insert into member(mid,name,email) values (2,'jack','scott@163.com');
insert into member(mid,name,email) values (2,'jack','scott@163.com')
*
第 1 行出现错误:
ORA-00001: 违反唯一约束条件 (SCOTT.SYS_C0010891)
ログイン後にコピー

制約の名前を指定してください

このエラーは、どのフィールドに前述の非 null 制約のような問題があるのか​​をユーザーに正確に伝えるものではありません。この制約の名前。名前

create table member(
    mid number,
    name varchar2(200) not null,
    email varchar2(50),    
    constraint uk_email unique(email)
    );
ログイン後にコピー

主キー制約 PK

主キー制約 = 空でない制約 一意の制約

create table member(
    mid number,
    name varchar2(200) not null,
    email varchar2(50),    
    constraint pk_number primary key(mid),    
    constraint uk_email unique(email)
    );
ログイン後にコピー

間違ったデータを挿入していますエラーが報告されます:

SQL> insert into member(mid,name,email) values (1,'jack','scott@163.com');
ログイン後にコピー

1 行が作成されました

SQL> insert into member(mid,name,email) values (1,'jack','jack@163.com');
insert into member(mid,name,email) values (1,'jack','jack@163.com')
*
第 1 行出现错误:
ORA-00001: 违反唯一约束条件 (SCOTT.PK_NUMBER)
ログイン後にコピー

チェック制約 CK

create table member(
   mid number,    
   name varchar2(200) not null,    
   age number check(age between 0 and 200),    
   sex varchar2(10),    
   email varchar2(50),    
   constraint pk_number primary key(mid),    
   constraint uk_email unique(email),    
   constraint ck_sex check(sex in('男','女'))    
   );
ログイン後にコピー

間違ったデータの挿入エラー:

SQL> insert into member(mid,name,age,sex,email) values (1,'Jack','300','无','jack@163.com');
insert into member(mid,name,age,sex,email) values (1,'Jack','300','无','jack@163.com')
*
第 1 行出现错误:
ORA-02290: 违反检查约束条件 (SCOTT.CK_SEX)
ログイン後にコピー

主外部キー制約 FK

create table member(
    mid number,
    name varchar2(200) not null,    
    constraint pk_mid primary key(mid)
    );    
create table advice(
       adid number,
       content clob not null,
       mid number,       
       constraint pk_adid primary key(adid),       
       constraint fk_mid foreign key(mid) references member(mid)
       );
ログイン後にコピー

データを正しく挿入します。mid はアタッチされたテーブルにすでに存在します

insert into member(mid,name) values (1,'Scott');
insert into member(mid,name) values (2,'Jack');
insert into advice(adid,content,mid) values (1,'test',1);
insert into advice(adid,content,mid) values (2,'test',2);
commit;
ログイン後にコピー

に存在しない Mid データを挿入します親テーブル

SQL> insert into advice(adid,content,mid) values (3,'test',3);
insert into advice(adid,content,mid) values (3,'test',3)
*
第 1 行出现错误:
ORA-02291: 违反完整约束条件 (SCOTT.FK_MID) - 未找到父项关键字
ログイン後にコピー

主キー制約と外部キー制約を採用すると、テーブルの削除とデータ削除で新たな問題が発生します

親テーブルを削除するには、まず子テーブルを削除する必要があります

SQL> drop table member;drop table member           
*
第 1 行出现错误:
ORA-02449: 表中的唯一/主键被外键引用
ログイン後にコピー

親テーブルを強制的に削除すると、パージ オプションは使用できなくなり、ワード テーブルの主キー制約と外部キー制約は存在しなくなります

SQL> drop table member cascade constraint;
表已删除。
SQL> insert into advice(adid,content,mid) values (3,'test',3);
ログイン後にコピー

1 行が作成されました

To親テーブルのデータを削除するには、まずテーブルという単語のデータを削除します

SQL> delete from member where mid=1;
delete from member where mid=1
*
第 1 行出现错误:
ORA-02292: 违反完整约束条件 (SCOTT.FK_MID) - 已找到子记录
ログイン後にコピー

この方法に加えて、カスケード操作句を設定することもできます

on delete cascade

create table advice(
       adid number,
       content clob not null,
       mid number,       
       constraint pk_adid primary key(adid),       
       constraint fk_mid foreign key(mid) references member(mid) on delete cascade
       );
ログイン後にコピー

この場合、付録データを削除するとワードテーブル内のデータも削除されます。

on delete set null

create table advice(       
adid number,       
content clob not null,       
mid number,       
constraint pk_adid primary key(adid),       
constraint fk_mid foreign key(mid) references member(mid) on delete set null      
 );
ログイン後にコピー

親テーブルのデータを削除すると、子テーブルの対応する関連フィールドは null

SQL> delete from member where mid=1;

已删除 1 行。

SQL> select * from advice;

      ADID CONTENT         MID
---------- ---------- ----------
    test
    test            2
ログイン後にコピー
に設定されます

制約の表示#

SQL>  select constraint_name,constraint_type,table_name  from user_constraints; 

CONSTRAINT_NAME            C   TABLE_NAME
------------------------------ - ------------------------------
FK_DEPTNO                  R       EMP
PK_EMP                     P       EMP
PK_DEPT                    P       DEPT
ログイン後にコピー

#R 外部キー制約、C チェック制約、Q 一意制約、P 主キー制約

##制約の変更

制約の追加

alter table member add constraint pk_mid primary key(mid);
alter table member add constraint ck_age check(age between 0 and 200);
alter table member modify (name varchar2(50) not null);
ログイン後にコピー

null 以外の制約では変更メソッドが使用されることに注意してください

制約の無効化/有効化

Non -外部キー

alter table member disable constraint ck_age;
alter table member enable constraint ck_age;
ログイン後にコピー

外部キー

alter table member disable constraint pk_mid cascade;
ログイン後にコピー

削除制約

alter table member drop constraint pk_mid cascade;
alter table member drop constraint ck_age;
ログイン後にコピー

以上がSQL 整合性制約とは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート