21.2.9(火)DB/DDL(CREATE)(2)

11325 ワード

(6)制約


(2)UNIQUE(重複制約)


:列の繰返し値を制限する制約
挿入/変更時に既存のカラム値に重複する値がある場合は、追加または変更は避けてください.
[表現]
  • 列レベル
    :CREATEテーブル名(
    列1 UNIQUE,
    列2、
    コラム3...
    )
  • <예시>
    CREATE TABLE MEM_UNIQUE(
        MEM_NO NUMBER NOT NULL,
        MEM_ID VARCHAR2(20) NOT NULL UNIQUE,  => 컬럼에다가 UNIQUE 제약조건 부여 
        MEM_PWD VARCHAR2(20) NOT NULL,
  • 表レベル
    :CREATEテーブル名(
    列1、
    列2、
    コラム3...
    UNIQUE(制約を追加する列1、制約を追加する列2)
    )
  • <예시>
    CREATE TABLE MEM_UNIQUE(
        MEM_NO NUMBER NOT NULL,
        MEM_ID VARCHAR2(20) NOT NULL, 
        MEM_PWD VARCHAR2(20) NOT NULL,
        MEM_NAME VARCHAR2(20) NOT NULL,
        GENDER CHAR(3),
        PHONE VARCHAR2(15),
        EMAIL VARCHAR2(30),
        UNIQUE (MEM_ID) -- 테이블레벨 방식
    );

    (3)命名制約


    :制約に違反すると、制約名が表示されます.
  • <例>
    (1)UNIQUE制約違反でINSERT失敗!
    ->(2)エラー構文を制約名として通知する
    (DDL.SYS C 007139、カラム名は指定されていません)
    =>問題がどこにあるかを特定するのは難しい
    ->(3)制約が与えられたときに直接制約名(DDL.SYS C 007139)が指定されていない場合、SYSC~
  • のように任意の制約名を指定します
    [表現]
    制約が与えられたときに制約名を指定する式
  • カラム・レベル(1つずつ)
    =>カラムレベルで制約を指定するCREATE TABLEテーブル名(
    カラム名1(CONTRAINT制約名)制約(NOT NULL,UNIQUE...);
    カラム名2データ型2(CONTRAINT制約名)制約(NOT NULL,UNIQUE...);
    ....
    );

  • 表レベル(後で)
    CREATE TABLEテーブル名(
    コラム名1資料型1
    コラム名2資料型2
    ....
    (CONTRAINT制約名)制約(カラム名)
    )
    =>コンストレインの場合、CONTRAINTコンストレインの名前を付けてください(例>DDL.SYS C 007139).
  • <예시>
    CREATE TABLE MEM_CON_NM(
        MEM_NO NUMBER NOT NULL,
        MEM_ID VARCHAR2(20) NOT NULL, 
        MEM_PWD VARCHAR2(20) NOT NULL,
        MEM_NAME VARCHAR2(20) CONSTRAINT MEM_NAME_NN NOT NULL, --<컬럼레벨방식>
        GENDER CHAR(3),
        PHONE VARCHAR2(15),
        EMAIL VARCHAR2(30),
        CONSTRAINT MEM_ID UQ UNIQUE (MEM_ID) --<테이블레벨 방식>
    );
    

    (4) CHECK


    :カラムに記録できる値の条件を設定できます.
    [表現]
    CHECK条件式
    <예시>
    CREATE TABLE MEM_CHECK(
        MEM_NO NUMBER NOT NULL,
        MEM_ID VARCHAR(20) NOT NULL UNIQUE,
        MEM_PWD VARCHAR(20) NOT NULL,
        MEM_NAME VARCHAR(20) NOT NULL,
        GENDER CHAR(3) CHECK(GENDER IN ('남', '여')), --> < 또는   입력해야함>
        PHONE VARCHAR2(15),
        EMAIL VARCHAR2(30),
        MEM_DATE DATE NOT NULL
    );

    (5)DEFAULT(非拘束!)


    :特定の列に入る値を設定できます.
    [表現]
    カラム名データ型DEFAULTデフォルト
    CREATE TABLE MEM_CHECK(
        MEM_NO NUMBER NOT NULL,
        MEM_ID VARCHAR(20) NOT NULL UNIQUE,
        MEM_PWD VARCHAR(20) NOT NULL,
        MEM_NAME VARCHAR(20) NOT NULL,
        GENDER CHAR(3) CHECK(GENDER IN ('남', '여')),
        PHONE VARCHAR2(15),
        EMAIL VARCHAR2(30),
        MEM_DATE DATE DEFAULT SYSDATE NOT NULL --> <SYSDATE로 기본값 설정하겠다>
    );
    
    INSERT INTO MEM_CHECK(MEM_NO, MEM_ID, MEM_PWD, MEM_NAME)
    VALUES(1, 'user01', 'pass01', '강개똥'); 
    
    --> 여기에 지정되지 않은 컬럼에는 기본적으로 null 값이 들어가지만,
    <만일 default 값이 부여되어 있다면 null값이 아닌 default값으로 들어감!!>

    (6) PRIMARY KEY


    :テーブル内の各行の情報に、一意に識別可能なカラムの制約を付与します.
    ->各行の識別子役割を区別できます(EX.アカデミー番号、注文番号、4番、学番、予約番号...)
    ->PRIMARY KEYを、値が存在し、重複しないカラムに割り当てる(NOT NULL+UNIQUE)
    テーブルごとに1つしか設定できません

    ※ただしリールをPRIMARY KEYキー->複合キーに組み合わせることは可能です


    例>PRIMARY KEY(MEM NO,MEM ID)
    <예시>
    CREATE TABLE MEM_PRIMARYKEY1(
        MEM_NO NUMBER CONSTRAINT MEM_PK PRIMARY KEY, -- 컬럼레벨 방식
        MEM_ID VARCHAR(20) NOT NULL UNIQUE,
        MEM_PWD VARCHAR(20) NOT NULL,
        MEM_NAME VARCHAR(20) NOT NULL,
        GENDER CHAR(3) CHECK(GENDER IN ('남', '여')),
        PHONE VARCHAR2(15),
        EMAIL VARCHAR2(30),
        -- CONSTRAINT MEM_PK PRIMARY KEY (MEM_NO) -- 테이블레벨 방식
    );
    
    PRIMARY KEY 제약조건은 NULL or 중복값(UNIQUE) 들어가면 안 됨!!
    
    <컬럼 묶어서 PRIMARY KEY 지정>
    CREATE TABLE MEM_PRIMARYKEY2(
        MEM_NO NUMBER PRIMARY KEY, -- 컬럼레벨 방식
        MEM_ID VARCHAR(20) NOT NULL,
        MEM_PWD VARCHAR(20) NOT NULL,
        MEM_NAME VARCHAR(20) NOT NULL,
        GENDER CHAR(3) CHECK(GENDER IN ('남', '여')),
        PHONE VARCHAR2(15),
        EMAIL VARCHAR2(30),
        PRIMARY KEY (MEM_NO, MEM_ID)
    );
    --> 이건 가능함!!
    단, 단점은 MEM_NO 컬럼과 MEM_ID 컬럼의 중복값이 각각 하나만 중복될때는 중복으로 인식하지 않게됨!! 
    (AND 개념임, OR 개념이 아님)
    예를들면, MEM_NO 컬럼은 중복이지만 MEM_ID가 중복이 아닐경우에는 제약조건에 걸리지 않아 정상적으로 출력됨.
    
    그러므로 잘 쓰이지는 않음!
    
    => 대신에 NULL값은 바로 안 됨!

    (7)FOREGN KEY(外部拘束キー)


    :制約条件を、別のテーブルでのみ値を入力できる列に付与します.
    -->別の表を参照
    つまり、別の参照テーブル(親テーブル)が指定している値しか入力できません.
    -->FOREGN KEY制約により、他のテーブル間の関係を確立できます.

  • 列レベル方式
    カラム名データ型(CONTRAINT制約名)参照するREFERENCESテーブル名(参照するカラム名)

  • 表レベル方式
    (CONTRAINT制約名)FOREGN KEYが参照するテーブル名(参照するカラム名)
    ->(参照するカラム名)は省略できますが、省略するとPRIMARY KEYのあるカラムとして認識されます
  • */
    <예시>
    CREATE TABLE MEM(
        MEM_NO NUMBER PRIMARY KEY,
        MEM_ID VARCHAR2(20) NOT NULL UNIQUE,
        MEM_PWD VARCHAR2(20) NOT NULL,
        MEM_NAME VARCHAR2(20) NOT NULL,
        GRADE_ID CHAR(2) REFERENCES MEM_GRADE(GRADE_CODE), -- 컬럼레벨방식 => (GRADE_CODE) 생략도 가능함
        GENDER CHAR(3) CHECK(GENDER IN ('남', '여')),
        PHONE VARCHAR2(15),
        EMAIL VARCHAR2(30)
        -- FOREIGN KEY(GRADE_ID) REFERENCES MEM_GRADE(GRADE_CODE) -- 테이블레벨방식
    );
    
    - 외래키 제약조건 오류발생 예시 -
    <NULL: 외래키 제약조건이 걸려있는 컬럼에는 기본적으로 NULL값이 불가>
    <부모컬럼존재X: 외래키 제약조건이 있는 컬럼에서 제공하는 값이 없을경우 생성불가 -parent key not found>
    
    ※適用
    別のテーブル(親テーブル)からカラムデータを削除した場合?
    サブテーブルの作成(外部キー制約の付与)
    親テーブルのデータが削除されると、サブテーブルの処理方法をオプションに設定できます.
    <예시>
    CREATE TABLE MEM(
        GRADE_ID CHAR(2) REFERENCES MEM_GRADE(GRADE_CODE), -- 컬럼레벨방식 => (GRADE_CODE) 생략도 가능함
    => MEM(자식) 테이블에 MEM_GRADE(부모) 테이블을 참조함  
    
    MEM_GRADE (부모테이블) 테이블의 GRADE_CODE가 G1인 데이터 지우기
    DELETE FROM MEM_GRADE 
    WHERE GRADE_CODE = 'G1'; 삭제 안 됨
    --> 자식테이블 중에 한 컬럼을 사용하고 있기 때문에 삭제할 수 없음!
        (만약 참조하고 있는 값이 없다면 위 같은 방법으로 삭제는 가능함.)
    --> 현재 외래키 제약조건 부여시 삭제옵션을 부여 안 했음!
    --> 자식테이블에서 사용하고 있는 값이 있을 경우 삭제가 안되는 <"삭제제한옵션"> 걸려있음!
    =>この時点で使用する制約オプション

    (8)FOREGN KEYオプションの削除


    :外部キーテーブルでの列の削除オプション
    =>削除オプションが個別に提示されていない場合、デフォルトはON DELETE RESTRICTED(削除制限)
  • 1) ON DELETE SET NULL
    :
  • 、親データの削除時に使用する子データをNULLに変更
    [表現]
    FOREGN KEY(列)REFERENCES参照するテーブル(参照する列)ON DELETE SET NULL
    <예시>
    CREATE TABLE MEM(
        MEM_NO NUMBER PRIMARY KEY,
        MEM_ID VARCHAR2(20) NOT NULL UNIQUE,
        MEM_PWD VARCHAR2(20) NOT NULL,
        MEM_NAME VARCHAR2(20) NOT NULL,
        GRADE_ID CHAR(2) 
        GENDER CHAR(3) CHECK(GENDER IN ('남', '여')),
        PHONE VARCHAR2(15),
        EMAIL VARCHAR2(30)
        FOREIGN KEY(GRADE_ID) REFERENCES MEM_GRADE(GRADE_CODE) ON DELETE SET NULL
    );
  • 2) ON DELETE CASCADE
    :
  • 、親データの削除時にそのデータを使用する子データを同時に削除
    [表現]
    FOREGN KEY(列)REFERENCES参照するテーブル(参照する列)ON DELETE CASCADE
    <예시>
    CREATE TABLE MEM(
        MEM_NO NUMBER PRIMARY KEY,
        MEM_ID VARCHAR2(20) NOT NULL UNIQUE,
        MEM_PWD VARCHAR2(20) NOT NULL,
        MEM_NAME VARCHAR2(20) NOT NULL,
        GRADE_ID CHAR(2) 
        GENDER CHAR(3) CHECK(GENDER IN ('남', '여')),
        PHONE VARCHAR2(15),
        EMAIL VARCHAR2(30)
        FOREIGN KEY(GRADE_ID) REFERENCES MEM_GRADE(GRADE_CODE) ON DELETE CASCADE
    );