21.2.9(火)DB/DDL(CREATE)(2)
(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~
[表現]
制約が与えられたときに制約名を指定する式
=>カラムレベルで制約を指定する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(削除制限)
:
[表現]
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
);
:
[表現]
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
);
Reference
この問題について(21.2.9(火)DB/DDL(CREATE)(2)), 我々は、より多くの情報をここで見つけました https://velog.io/@alsrnr45/21.2.9화-DBDDLCREATE2テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol