ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SQL] Constraint(์„ ์–ธ์  ๋ฌด๊ฒฐ์„ฑ ์ œ์•ฝ ์‚ฌํ•ญ)
    Computer Science/DB 2023. 4. 20. 21:01
    728x90

    ๐Ÿ‘€ ์œ ์šฉํ•œ ์ •๋ณด

    ๋ฐ์ดํ„ฐ ๋”•์…”๋„ˆ๋ฆฌ ์กฐํšŒ

    ๐Ÿ’ก
    USER_ : ~์†Œ์œ ์˜ ๋ชจ๋“  USER_TABLES : ๋‚ด ์†Œ์œ ์˜ ํ…Œ์ด๋ธ” โ†” SELECT * FROM TAB : ๋‚ด๊ฐ€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ…Œ์ด๋ธ” USER_TAB_COLUMNS : ๋‚ด์†Œ์œ ์˜ ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ ์ •๋ณด USER_INDEXES : ๋‚ด ์†Œ์œ ์˜ ์ธ๋ฑ์Šค USER_CONS_COLUMNS : ๋‚ด ์†Œ์œ ์˜ ์ปฌ๋Ÿผ ์ œ์•ฝ ์‚ฌํ•ญ
    select * from user_tables;
    select * from tab;
    select * from USER_TAB_COLUMNS;
    select * from USER_INDEXES;
    select * from user_cons_columns;

    ๐Ÿ’กํ”ผ๋“œ๋ฐฑ Tip

    ๐Ÿ’ก
    ํ…Œ์ด๋ธ”์„ ์‚ญ์ œํ•˜๋ฉด (DROP TABLE) : ํ…Œ์ด๋ธ” ์ƒ์„ฑ์‹œ ์ •์˜ํ–ˆ๋˜ ์ œ์•ฝ์‚ฌํ•ญ ๋“ฑ ๋ชจ๋‘ ํ•จ๊ป˜ ์‚ญ์ œ๋œ๋‹ค.
    ๐Ÿ’ก
    ์ œ์•ฝ ์‚ฌํ•ญ๋งŒ ์‚ญ์ œํ•˜๋Š” ๋ฐฉ๋ฒ•
    ALTER TABLE ํ…Œ์ด๋ธ”์ด๋ฆ„
    DROP CONSTRAINT ์ œ์•ฝ์‚ฌํ•ญ์ด๋ฆ„;

    ์ œ์•ฝ ์‚ฌํ•ญ๋งŒ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•

    ALTER TABLE ํ…Œ์ด๋ธ”์ด๋ฆ„
    ADD CONSTRAINT ์ œ์•ฝ์‚ฌํ•ญ์ด๋ฆ„ ์ œ์•ฝ์กฐ๊ฑด;
    ๐Ÿ’ก
    ์ถ”ํ›„ ํ”„๋กœ์ ํŠธ์— OAUTH ์ธ์ฆ ํ™œ์šฉ ๋„์ž… DB ๋ชจ๋ธ๋ง ์‹œ, ์ œ์•ฝ ์‚ฌํ•ญ์„ ์ž˜ ๊ฑธ์ž


    ๐Ÿ“˜ Constraint (์„ ์–ธ์  ๋ฌด๊ฒฐ์„ฑ ์ œ์•ฝ ์‚ฌํ•ญ)

    ๐Ÿ’ก
    ๋ฌด๊ฒฐ์„ฑ ์ œ์•ฝ์‚ฌํ•ญ : ์“ฐ๋ ˆ๊ธฐ ๋ฐ์ดํ„ฐ(Business Rule์„ ์œ„๋ฐ˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ)๋ฅผ ์—†์• ๊ณ  Business Rule์„ ๋”ฐ๋ฅด๋Š” ๋ฐ์ดํ„ฐ๋งŒ์„ ๊ฐ€์ง€๋„๋ก ํ•˜๊ธฐ ์œ„ํ•จ

    ์„ ์–ธ์  ๋ฌด๊ฒฐ์„ฑ ์ œ์•ฝ์‚ฌํ•ญ : ์ •์˜ / ์„ ์–ธ

    ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ

    ๐Ÿ’ก
    ๋ฌด๊ฒฐ์„ฑ ๋ฌดํšจ๊ฐฑ์‹ ์œผ๋กœ ๋ถ€ํ„ฐ ํ…Œ์ด๋ธ”๋‚ด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์œ„/๋ณ€์กฐ,ํ›ผ์†ํ•˜์ง€ ๋ชปํ•˜๋„๋ก ์ œ์•ฝ(Constraint)ํ•˜์—ฌ ๋ฐ์ดํ„ฐ์˜ ์œ ํšจ์„ฑ, ์ผ๊ด€์„ฑ, ์™„์ „์„ฑ, ์ •ํ™•์„ฑ, ์ •๋ฐ€์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ์„ฑ์งˆ - ๋ฌด๊ฒฐ์„ฑ์„ ์ง€ํ‚ค๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค!!

    โญ ๋ฌด๊ฒฐ์„ฑ ์ œ์•ฝ์‚ฌํ•ญ ๊ตฌํ˜„ ๋ฐฉ๋ฒ• 3๊ฐ€์ง€ โญ โ‘  ์„ ์–ธ์  ๋ฌด๊ฒฐ์„ฑ ์ œ์•ฝ์‚ฌํ•ญ(Declarative Integrity Constraint) * DBMS์—์„œ ํ…Œ์ด๋ธ” ์ •์˜ ์‹œ P.K, U.K ๋“ฑ ์ œ์•ฝ์‚ฌํ•ญ ์ •์˜ โ‘ก Trigger (PL/SQL) * DBMS ๋ ˆ๋ฒจ์—์„œ PK/SQL ์œผ๋กœ ์ œ์•ฝ์‚ฌํ•ญ ๋กœ์ง ๊ตฌํ˜„ โ‘ข Application Logic (Coding) * JAVA, C (์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ์—์„œ ์ œ์•ฝ์‚ฌํ•ญ ๊ตฌํ˜„) โ‡’ ๋ฌด๊ฒฐ์„ฑ ์ œ์•ฝ์‚ฌํ•ญ์˜ ๊ตฌํ˜„ ๋ฐ ๊ฒ€์ฆ์€, ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜, DBMS ๋ ˆ๋ฒจ ๊ฐ๊ฐ ๋ชจ๋‘ ์ด์ค‘์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ์„ ์–ธ์  ๋ฌด๊ฒฐ์„ฑ ์ œ์•ฝ์‚ฌํ•ญ ์„ ์–ธ์ ์ด๋ž€ ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋”ฉ์„ ํ•˜์ง€ ์•Š๊ณ  ํ…Œ์ด๋ธ” ์ƒ์„ฑ์‹œ ๋˜๋Š” ์ƒ์„ฑํ›„ ์ปฌ๋Ÿผ์ด๋‚˜ ํ…Œ์ด๋ธ”์— ๋ฌด๊ฒฐ์„ฑ ์ œ์•ฝ์‚ฌํ•ญ์„ ํ‘œ๊ธฐํ•˜์—ฌ ์ •์˜(define)ํ•˜๋Š” ๋ฐฉ์‹ โ‘  PRIMARY KEY : ๋Œ€ํ‘œ์„ฑ(์—ฌ๋Ÿฌ ํ›„๋ณดํ‚ค ๋“ค ์ค‘), ๊ณ ์œ ์„ฑ, ์กด์žฌ์„ฑ(Not NULL)์„ ๋ณด์žฅํ•˜๋ฉฐ ํ…Œ์ด๋ธ”๋‹น 1๊ฐœ๋งŒ ์ •์˜, Unique Index ์ž๋™ ์ƒ์„ฑ , Unique Key + NOT NULL์˜ ๊ฒฐํ•ฉํ˜•ํƒœ ex) ์•„์ด๋”” โ‘ก UNIQUE KEY : ๋ฐ์ดํ„ฐ์˜ ๊ณ ์œ ์„ฑ ๋ณด์žฅ, ํ…Œ์ด๋ธ”์— N๊ฐœ์˜ ์ •์˜ ๊ฐ€๋Šฅ, NULL ํ—ˆ์šฉ,Unique Index ์ž๋™ ์ƒ์„ฑ ex) email, ํœด๋Œ€์ „ํ™” ๋ฒˆํ˜ธ ๋“ฑ โ‘ข CHECK : ๊ฐ’์˜ ๋ฒ”์œ„ ๋‚˜ ์กฐ๊ฑด์„ ์ง€์ •,Boolean ์—ฐ์‚ฐ โ‘ฃ NOT NULL : NULL(๊ฑ€์ธก์น˜)์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ํ•„์ˆ˜ ์ž…๋ ฅ ์‚ฌํ•ญ ์ •์˜ โ‘ค FOREIGN KEY : ํ…Œ์ด๋ธ” ๊ฐœ์ฒด๊ฐ„์˜ ์ฐธ์กฐ ๊ด€๊ณ„ ์ •์˜, ๋‚ด์šฉ์— ์˜ํ•œ ์ฐธ์กฐ

    Primary Key๋Š” ํ…Œ์ด๋ธ” ๋‹น 1๊ฐœ, Unique Key๋Š” ํ…Œ์ด๋ธ”๋‹น ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. โ‡’ Primary Key์˜ ๋Œ€ํ‘œ์„ฑ

    • ํšŒ์› ์ •๋ณด ์ค‘ ์œ ์ผ์„ฑ์„ ๊ฐ€์ง„ ํ›„๋ณดํ‚ค ex) ID, SocialNo, Email, PhoneNo ๋“ฑ
      • ํฌํ„ธ ์‚ฌ์ดํŠธ์—์„œ์˜ ๊ธฐ๋ณธํ‚ค : ID
      • OAUTH์—์„œ์˜ ๊ธฐ๋ณธํ‚ค : Email
      • ๊ตญ๊ฐ€ ๊ธฐ๊ด€ ํ™ˆํŽ˜์ด์ง€์—์„œ์˜ ๊ธฐ๋ณธํ‚ค : SocialNo

    โ†’ ์ด์ฒ˜๋Ÿผ ๊ธฐ๋ณธ ํ‚ค๋Š” ์‚ฌ์šฉ์ฒ˜์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค.

    LEVEL ๊ณผ ์ƒ์„ฑ์‹œ๊ธฐ LEVEL โ‘  TABLE : ํ…Œ์ด๋ธ”์— ์ •์˜ํ•˜๋Š” ์ œ์•ฝ ์‚ฌํ•ญ์œผ๋กœ ์—ฌ๋Ÿฌ ์ปฌ๋Ÿผ์ด ์ œ์•ฝ ์‚ฌํ•ญ์— ๊ด€์—ฌํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ โ‘ก COLUMN : ํŠน์ • ์ปฌ๋Ÿผ์— ์ •์˜ํ•˜๋Š” ์ œ์•ฝ ์‚ฌํ•ญ ์ƒ์„ฑ ์‹œ๊ธฐ โ‘  TABLE ์ƒ์„ฑ์‹œ ์ƒ์„ฑ โ‘ก TABLE ์ƒ์„ฑํ›„ ์ž„์˜์˜ ์‹œ์ ์— ์ถ”๊ฐ€

    NOT NULL

    ๐Ÿ’ก
    NOT NULL์€ NULL์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ์ฆ‰ ๋ฐ์ดํƒ€๊ฐ€ ํ•„์ˆ˜์ ์œผ๋กœ ์กด์žฌํ•˜๋„๋ก ํ•˜๋Š” ์ œ์•ฝ ์‚ฌํ•ญ โ‘  ํ…Œ์ŠคํŠธ ๋Œ€์ƒ ํ…Œ์ด๋ธ” ์ƒ์„ฑ
    CREATE TABLE CUSTOMER2(
    ID VARCHAR2(8) NOT NULL,                             -- NOT NULL ์ œ์•ฝ ์‚ฌํ•ญ ์ •์˜
    PWD VARCHAR2(8) CONSTRAINT CUSTOMER_PWD_NN NOT NULL, -- ํ•ด๋‹น ์ œ์•ฝ ์‚ฌํ•ญ์˜ ์ด๋ฆ„์„ ๋ช…์‹œ
    NAME VARCHAR2(20), -- ์ด๋ฆ„
    SEX CHAR(1), -- ์„ฑ๋ณ„ [M|F] M:Male F: Female
    AGE NUMBER(3) -- ๋‚˜์ด
    );
    
    DESC CUSTOMER2
    • NOT NULL์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ œ์•ฝ ์‚ฌํ•ญ์˜ ์ด๋ฆ„์„ ๊ตณ์ด ๋ถ™์ด์ง€๋Š” ์•Š๋Š”๋‹ค.
    • ์ œ์•ฝ ์‚ฌํ•ญ์˜ ์ด๋ฆ„์„ ๋ถ€์—ฌํ•˜์ง€ ์•Š์œผ๋ฉด DBMS๊ฐ€ ์ž„์˜๋กœ ์„ค์ •ํ•œ๋‹ค.

    โ‘ก

    INSERT INTO CUSTOMER(ID,PWD,NAME,SEX, AGE) VALUES('xman','ok','kang', 'M',21);
    INSERT INTO CUSTOMER(ID,PWD,NAME,SEX,AGE) VALUES('XMAN','no','kim', 'T',-20);
    • ์ •์ƒ์  ์ž…๋ ฅ

    โ‘ข

    INSERT INTO CUSTOMER(ID,NAME,AGE) VALUES('zman','son',99);
    INSERT INTO CUSTOMER(ID,PWD,NAME,AGE) VALUES('rman',NULL,'jjang',24);
    INSERT INTO CUSTOMER(ID,PWD,NAME,AGE) VALUES('', 'pwd' ,'jjang',24);
    • PWD,SEX ์ปฌ๋Ÿผ์— ์•”์‹œ์ /๋ช…์‹œ์  NULL์„ ์‚ฝ์ž…ํ•˜๋ ค ํ•˜์ง€๋งŒ PWD์ปฌ๋Ÿผ์˜ NOT NULL ์ œ์•ฝ์‚ฌํ•ญ์œผ๋กœ INSERT๋Š” ์—๋Ÿฌ ๋ฐœ์ƒ.
    • DML ์—ฐ์‚ฐ์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•จ์— ๋”ฐ๋ผ ๋ถ€์ ์ ˆํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐœ์ƒํ• ์ˆ˜ ์žˆ๋‹ค. DML ์—ฐ์‚ฐ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝ ํ•˜๊ธฐ์ „์— ๋ฌด๊ฒฐ์„ฑ ์ œ์•ฝ์‚ฌํ•ญ์„ ์œ„๋ฐ˜ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ ๊ฒ€ํ•œ ํ›„ ๋ฌด๊ฒฐ์„ฑ ์ œ์•ฝ์‚ฌํ•ญ์„ ์œ„๋ฐ˜ํ•˜๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น DML ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ณ  ์ทจ์†Œ ์ฒ˜๋ฆฌ.

    โ‘ฃ

    UPDATE CUSTOMER SET PWD = NULL WHERE ID = 'XMAN'; -- ID๊ฐ€ XMAN์ธ ROW๋งŒ ์ˆ˜์ •
    SELECT * FROM CUSTOMER;
    • UPDATE์—ฐ์‚ฐ์€ PWD์˜ NOT NULL ์ œ์•ฝ์‚ฌํ•ญ์œผ๋กœ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ

    โ‘ค ๋ฐ์ดํ„ฐ๋”•์…”๋„ˆ๋ฆฌ(์‹œ์Šคํ…œ ์นดํƒ€๋กœ๊ทธ)์—์„œ ์ œ์•ฝ์‚ฌํ•ญ ํ™•์ธํ•˜๊ธฐ

    -- CUSTOMER2 ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์ œ์•ฝ ์‚ฌํ•ญ ํ™•์ธ
    SELECT TABLE_NAME,CONSTRAINT_NAME,CONSTRAINT_TYPE,SEARCH_CONDITION
    FROM USER_CONSTRAINTS
    WHERE TABLE_NAME = 'CUSTOMER';
    
    --
    SELECT TABLE_NAME,CONSTRAINT_NAME,POSITION,COLUMN_NAME
    FROM USER_CONS_COLUMNS
    WHERE TABLE_NAME = 'CUSTOMER' ORDER BY CONSTRAINT_NAME,POSITION;

    ๐Ÿ’ก
    ์ œ์•ฝ ์‚ฌํ•ญ์„ ์ถฉ์กฑ์‹œํ‚ค์ง€ ๋ชปํ•˜๋ฉด DML ์—ฐ์‚ฐ์ด ๊ฑฐ๋ถ€๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

    CHECK

    ๐Ÿ’ก
    โ CHECK
    • ์„ค์ •๋œ ์กฐ๊ฑด์„ ์ฒดํฌํ•˜์—ฌ Boolean ๊ฒฐ๊ณผ๊ฐ€ TRUE์ธ ๊ฒฝ์šฐ์—๋งŒ DML์—ฐ์‚ฐ ํ—ˆ์šฉ.

    โ‘  ํ…Œ์ด๋ธ” ์ƒ์„ฑํ›„ ์ œ์•ฝ์‚ฌํ•ญ ์ถ”๊ฐ€

    ALTER TABLE CUSTOMER ADD CONSTRAINT CUSTOMER_SEX_CK CHECK (SEX IN ('M','F')); -- ์กฐ๊ฑด
    • SQL ์˜ค๋ฅ˜: ORA-02293: (SCOTT.CUSTOMER_SEX_CK)์„ ๊ฒ€์ฆํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
    • ์ž˜๋ชป๋œ ์ œ์•ฝ ์‚ฌํ•ญ ํ™•์ธ
    ๐Ÿ’ก
    ํ…Œ์ด๋ธ” ์ƒ์„ฑ์‹œ ์ œ์•ฝ์‚ฌํ•ญ ์ •์˜ / ๊ธฐ์กด ์ƒ์„ฑ๋œ ํ…Œ์ด๋ธ”์— ์ œ์•ฝ์‚ฌํ•ญ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ ์ œ์•ฝ์‚ฌํ•ญ์„ ์ถ”๊ฐ€ํ•  ๋•Œ ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ฆํ•œ๋‹ค. ์ด๋ฏธ ๊ธฐ์กด์— ์ถ”๊ฐ€ํ•  ์ œ์•ฝ์‚ฌํ•ญ์— ์œ„๋ฐ˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ, ์ œ์•ฝ ์‚ฌํ•ญ ์ถ”๊ฐ€ ๋ถˆ๊ฐ€.

    โ‘ก

    UPDATE CUSTOMER SET SEX='M' WHERE SEX='T';
    COMMIT;
    ALTER TABLE CUSTOMER ADD CONSTRAINT CUSTOMER_SEX_CK CHECK (SEX IN ('M','F'));
    • ์ œ์•ฝ์‚ฌํ•ญ ์ถ”๊ฐ€์‹œ ๊ธฐ์กด์˜ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๋ฌด๊ฒฐ์„ฑ ๊ฒ€์‚ฌ.
    • ๊ธฐ์กด ๋ฐ์ดํ„ฐ๊ฐ€ ์ถ”๊ฐ€๋˜๋Š” ์ œ์•ฝ์‚ฌํ•ญ์„ ์œ„๋ฐ˜ํ•˜์—ฌ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌํ›„ ์ œ์•ฝ์‚ฌํ•ญ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

    โ‘ข

    INSERT INTO CUSTOMER(ID,PWD,NAME,SEX, AGE) VALUES('xman','ok','kang', 'M',21);
    INSERT INTO CUSTOMER(ID,PWD,NAME,SEX,AGE) VALUES('xman','ok', 'jjang','M',20);
    • ID๊ฐ€ ์ค‘๋ณต๋˜์ง€๋งŒ ์ž…๋ ฅ

    โ‘ฃ

     INSERT INTO CUSTOMER(ID,PWD,NAME,AGE) VALUES('asura','ok', 'joo',99);
    

    -์„ฑ๋ณ„(SEX) ์ปฌ๋Ÿผ์— NOT NULL ์ œ์•ฝ์‚ฌํ•ญ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— NULL ์ž…๋ ฅ. โ†’ CHECK( IN(โ€™Mโ€™, โ€˜Fโ€™))์˜ ์ œ์•ฝ์‚ฌํ•ญ์„ ์ถ”๊ฐ€ํ–ˆ์ง€๋งŒ, NULL์€ ๊ฑฐ๋ฅด์ง€ ๋ชปํ•œ๋‹ค.

    โ†’ NULL์— ๋Œ€ํ•œ ์ œ์•ฝ์‚ฌํ•ญ์€ ๊ผญ NOT NULL์„ ํ†ตํ•ด์„œ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

    โ‘ค

    INSERT INTO CUSTOMER(ID,PWD,NAME,SEX,AGE) VALUES('harisu','ok', 'susu','T',33);

    -์„ฑ๋ณ„(SEX) ์ปฌ๋Ÿผ์— Check ์ œ์•ฝ์‚ฌํ•ญ์œผ๋กœ M ๊ณผ F๋งŒ ์ž…๋ ฅ ๊ฐ€๋Šฅ ์—๋Ÿฌ๋ฐœ์ƒ

    โ‘ฅ

    INSERT INTO CUSTOMER(ID,PWD,NAME,SEX,AGE) VALUES('shinsun','ok', '๋„์‚ฌ', 'M',999);
    • AGE์ปฌ๋Ÿผ์€ NUMBER(3)์œผ๋กœ ์ •์˜๋˜์–ด 999๊ฐ€ ์ž…๋ ฅ๋œ๋‹ค.

    โ‘ฆ

    UPDATE CUSTOMER SET AGE = AGE + 1;
    • 1๋…„์ด ์ง€๋‚˜ ๊ณ ๊ฐ์˜ ๋‚˜์ด๋ฅผ +1 ํ•˜๋ ค๊ณ  UPDATE ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ ํšŒ์› shisun์€ 1000์œผ๋กœ ์ž๋ฆฌ์ˆ˜๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ๋ฌธ์žฅ ์ˆ˜์ค€ ๋กค๋ฐฑ(Statement Level Rollback) ๋ฐœ์ƒ.

    Unique Key

    ๐Ÿ’ก
    Unique Key
    • ์ปฌ๋Ÿผ ๋ฐ์ดํ„ฐ์˜ ๊ณ ์œ ์„ฑ์„ ๋ณด์žฅํ•˜๊ณ  NULL์„ ํ—ˆ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„์ˆ˜ ์žˆ์ง€๋งŒ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ๊ณ ์œ ํ•ด์•ผ ํ•œ๋‹ค.

    โ‘ 

    • CUSTOMER ํ…Œ์ด๋ธ” ์‚ญ์ œํ›„ ๋‹ค์‹œ ์ƒ์„ฑ
    • ID๋Š” ํ•„์ˆ˜ ์ž…๋ ฅ์‚ฌํ•ญ์ด๋ฉด์„œ ๊ณ ์œ ์„ฑ์„ ๊ฐ€์ ธ์•ผ ํ•ด์„œ NOT NULL + UNIQUE ์ œ์•ฝ์‚ฌํ•ญ ์ •์˜
    • MOBILE(ํ—จ๋“œํฐ)์€ ํ—จ๋“œํฐ์ด ์—†๋Š” ๊ณ ๊ฐ๋„ ์žˆ์ง€๋งŒ ํ—จ๋“œํฐ์ด ์žˆ๋Š”๊ฒฝ์šฐ ๊ณ ์œ ํ•œ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— UNIQUE ์ œ์•ฝ์‚ฌํ•ญ ์ •์˜
    DROP TABLE CUSTOMER;
    
    CREATE TABLE CUSTOMER(
    		ID VARCHAR2(8) NOT NULL CONSTRAINT CUSTOMER_ID_UK UNIQUE,
    		PWD VARCHAR2(8) NOT NULL,
    		NAME VARCHAR2(20),
    		SEX CHAR(1) DEFAULT 'M' -- ๋””ํดํŠธ
    		CONSTRAINT CUSTOMER_SEX_CK CHECK (SEX IN ('M','F')),
    		MOBILE VARCHAR2(14) UNIQUE,
    		AGE NUMBER(3) DEFAULT 18
    );

    โ‘ก ์•”์‹œ์  NULL โ†’ DEFAULT ๊ฐ’ ์น˜ํ™˜

    INSERT INTO CUSTOMER(ID,PWD,NAME,MOBILE, AGE) VALUES('xman','ok','kang', '011-3333',21);
    • ์„ฑ๋ณ„ ์ปฌ๋Ÿผ์— ์•”์‹œ์ ์œผ๋กœ NULL์ด ์ง€์ •๋˜์ง€๋งŒ DEFAULT์— ์˜ํ•ด์„œ 'M' ๊ฐ’์ด ์ €์žฅ๋œ๋‹ค.

    โ‘ข

    INSERT INTO CUSTOMER(ID,PWD,NAME, MOBILE,AGE) VALUES('XMAN','yes','kim','011-3334',33);
    • ๋ฐ์ดํ„ฐ๋Š” ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— xman ๊ณผ XMAN์€ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ

    โ‘ฃ

    INSERT INTO CUSTOMER(ID,PWD,NAME, MOBILE,AGE) VALUES('xman','yes','lee', '011-3335',-21);
    • ID์ค‘๋ณต์œผ๋กœ Unique ์ œ์•ฝ ์‚ฌํ•ญ ์œ„๋ฐ˜ ์—๋Ÿฌ ๋ฐœ์ƒ INSERT ์‹คํŒจ(ํšŒ์›๊ฐ€์ž… ์‹คํŒจ)

    โ‘ค

    INSERT INTO CUSTOMER(ID,PWD,NAME, MOBILE,AGE) VALUES('yman','yes','lee', '011-3333',28);
    • ํ—จ๋“œํฐ ๋ฒˆํ˜ธ ์ค‘๋ณต์œผ๋กœ Unique ์ œ์•ฝ ์‚ฌํ•ญ ์œ„๋ฐ˜ ์—๋Ÿฌ ๋ฐœ์ƒ INSERT ์‹คํŒจ(ํšŒ์›๊ฐ€์ž… ์‹คํŒจ)

    โ‘ฅ

     INSERT INTO CUSTOMER(ID,PWD,NAME, MOBILE) VALUES('๋ฌด๋ช…์ธ','yes',NULL, NULL);
    • ID์ปฌ๋Ÿผ์˜ NOT NULL ์ œ์•ฝ์‚ฌํ•ญ์œผ๋กœ NULL์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

    โ‘ค

    ALTER TABLE CUSTOMER ADD CONSTRAINT CUSTOMER_NAME_SEX_UK UNIQUE(NAME,SEX); -- ์กฐํ•ฉ์˜ ๊ณ ์œ ๊ฐ’
    ALTER TABLE CUSTOMER MODIFY(NAME NOT NULL);
    • ํ…Œ์ด๋ธ” ์ƒ์„ฑํ›„ ์ œ์•ฝ์‚ฌํ•ญ ์‹ ๊ทœ ์ถ”๊ฐ€
    • 2๊ฐœ ์ปฌ๋Ÿผ์„ ์กฐํ•ฉํ•˜์—ฌ Unique์ œ์•ฝ ์‚ฌํ•ญ์„ ์ƒ์„ฑ

    โ‘ฅ

    INSERT INTO CUSTOMER(ID,PWD,NAME, SEX) VALUES('rman','yes','syo', 'M'); -- 1
    INSERT INTO CUSTOMER(ID,PWD,NAME, SEX ) VALUES('Rman','yes','syo', 'F'); -- 2
    INSERT INTO CUSTOMER(ID,PWD,NAME, SEX) VALUES('RmaN','yes','syo', 'M'); -- 3
    SELECT * FROM CUSTOMER;
    • ID ๋ฐ์ดํ„ฐ ๋Œ€์†Œ๋ฌธ์ž - ์˜๋ฏธ์ ์œผ๋กœ ๊ฐ™์œผ๋ฏ€๋กœ ๊ฐ™์€ ์˜๋ฏธ
    • NAME+SEX ์กฐํ•ฉ์˜ Unique ์ œ์•ฝ์‚ฌํ•ญ โ†’ ์ด๋ฆ„์ด ๊ฐ™์ง€๋งŒ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋กœ ์ฒ˜๋ฆฌ

    โ‘ฆ INDEX ์ƒ์„ฑ ์—ฌ๋ถ€ ํ™•์ธ

    SELECT INDEX_NAME,INDEX_TYPE,UNIQUENESS FROM USER_INDEXES
    WHERE TABLE_NAME = 'CUSTOMER';
    SELECT INDEX_NAME,COLUMN_POSITION,COLUMN_NAME FROM USER_IND_COLUMNS
    WHERE TABLE_NAME = 'CUSTOMER' ORDER BY INDEX_NAME,COLUMN_POSITION;
    ๐Ÿ’ก
    UNIQUE ํ‚ค๋ฅผ ์ •์˜ํ•˜๋ฉด ํ•ด๋‹น ์ปฌ๋Ÿผ์— Unique Index๊ฐ€ ์ž๋™ ์ƒ์„ฑ๋œ๋‹ค. โ†’ Index : Quick Search ์šฉ๋„

    [์ฐธ๊ณ ]

    UNIQUE ์ œ์•ฝ์‚ฌํ•ญ ์ •์˜์‹œ ํ•ด๋‹น ์ปฌ๋Ÿผ์— INDEX ๊ฐ€ ์ž๋™ ์ƒ์„ฑ๋œ๋‹ค. INDEX๋Š” Data์— ๋Œ€ํ•œ ๋น ๋ฅธ ์ ‘๊ทผ(Quick Search)๋ฅผ ํ• ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค Object๋กœ Unique ์ œ์•ฝ์‚ฌํ•ญ ์ •์˜์‹œ Index ์ž๋™ ์ƒ์„ฑ๋˜๋Š” ์ด์œ ๋Š” ๋ฐ์ดํ„ฐ ์ž…๋ ฅ,์ˆ˜์ •์‹œ ์ค‘๋ณต ์—ฌ๋ถ€๋ฅผ ๋น ๋ฅด๊ฒŒ ํ™•์ธ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ƒ์„ฑ.

    Primary Key

    ๐Ÿ’ก
    PRIMARY๋Š” ์ฃผ์š”ํ•œ, ๊ธฐ๋ณธ์ ์ธ ์ด๋ผ๋Š” ์‚ฌ์ „์  ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๋ฉฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ PRIMARY KEY๋Š” ์ฃผํ‚ค ๋˜๋Š” ๊ธฐ๋ณธํ‚ค ๋ผ๊ณ  ํ•œ๋‹ค. ๊ธฐ๋ณธํ‚ค๋Š” ํ…Œ์ด๋ธ”๋‚ด์˜ ๊ฐ ๋ ˆ์ฝ”๋“œ(ํ–‰)์„ ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„ํ•˜๋Š” ๊ฐ’์„ ๊ฐ€์ง„ ์ปฌ๋Ÿผ(๋“ค)์˜ ์กฐํ•ฉ์œผ๋กœ ์ปฌ๋Ÿผ ๋ฐ์ดํ„ฐ์˜ ๊ณ ์œ ์„ฑ(Uniqueness) ๊ณผ ์กด์žฌ์„ฑ(Not Null)์„ ๋™์‹œ์— ๋ณด์žฅํ•˜๋Š” ์ œ์•ฝ์‚ฌํ•ญ.

    Primary Key์˜ ๊ธฐ๋ณธ ํŠน์ง•

    • ์ตœ์†Œ์„ฑ
    • ๊ณ ์œ ์„ฑ - Unique
    • ์กด์žฌ์„ฑ - NOT NULL
    • ๋ถˆ๋ณ€์„ฑ - ๊ฐ’์ด ๋ณ€ํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค (๋ถ€๋ชจ ํ‚ค๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ž์‹ FK๊ฐ€ ๋ชจ๋‘ ๋ณ€ํ•ด์•ผ ํ•˜๋ฏ€๋กœ)

    ํ…Œ์ด๋ธ”๋‚ด์— ๋ ˆ์ฝ”๋“œ(ํ–‰)์„ ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„ ํ• ์ˆ˜ ์žˆ๋Š” ์‹๋ณ„์ž ํ›„๋ณด๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ๋Š” ๊ฒฝ์šฐ ๋Œ€ํ‘œ์„ฑ์„ ๊ฐ€์ง„ ํ›„๋ณด๊ฐ€ PRIMARY KEY(๊ธฐ๋ณธํ‚ค)๊ฐ€ ๋˜๊ณ  ๋‚˜๋จธ์ง€ ํ›„๋ณด์ž๋“ค์€ UNIQUE KEY๊ฐ€ ๋œ๋‹ค. ๊ธฐ๋ณธํ‚ค๋Š” ํ…Œ์ด๋ธ”์— 1๊ฐœ๋งŒ ์ •์˜ํ• ์ˆ˜ ์žˆ๊ณ  UNIQUE KEY๋Š” ํ…Œ์ด๋ธ”์— N๊ฐœ ์ •์˜ ๊ฐ€๋Šฅ.

    โ‘ 

    ID๋Š” ํ•„์ˆ˜ ์ž…๋ ฅ์‚ฌํ•ญ์ด๋ฉด์„œ ๊ณ ์œ ์„ฑ์„ ๊ฐ€์ ธ์•ผ ํ•ด์„œ PRIMARY KEY๋กœ ์ œ์•ฝ์‚ฌํ•ญ ์ •์˜ MOBILE(ํ•ธ๋“œํฐ)์€ ํ—จ๋“œํฐ์ด ์—†๋Š” ๊ณ ๊ฐ๋„ ์žˆ์ง€๋งŒ ํ•ธ๋“œํฐ์ด ์žˆ๋Š”๊ฒฝ์šฐ ๊ณ ์œ ํ•œ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— UNIQUE KEY์ œ์•ฝ์‚ฌํ•ญ ์ •์˜.

    DROP TABLE CUSTOMER;
    
    CREATE TABLE CUSTOMER(
        ID VARCHAR2(8) CONSTRAINT CUSTOMER_ID_PK PRIMARY KEY, -- ์ œ์•ฝ ์‚ฌํ•ญ ์ด๋ฆ„ ์ •์˜ 
        PWD VARCHAR2(8) NOT NULL,
        NAME VARCHAR2(20),
        SEX CHAR(1) DEFAULT 'M'
        CONSTRAINT CUSTOMER_SEX_CK CHECK (SEX IN ('M','F')),
        MOBILE VARCHAR2(14) CONSTRAINT CUSTOMER_MOBILE_UK UNIQUE,
        AGE NUMBER(3) DEFAULT 18
    );

    โ‘ก ์„ฑ๋ณ„(SEX),๋‚˜์ด(AGE) ์ปฌ๋Ÿผ์— ์ •์˜๋œ DEFAULT๋Š” ์ž…๋ ฅ์‹œ ์ปฌ๋Ÿผ์˜ ๊ฐ’์ด ์ง€์ •๋˜์ง€ ์•Š๋Š” ์•”์‹œ์ ์ธ NULL์ด ์ง€์ •๋˜๋ฉด NULL ๋Œ€์‹  ์ €์žฅํ•˜๋Š” ๊ฐ’์œผ๋กœ ์„ฑ๋ณ„์—๋Š” 'M', ๋‚˜์ด๋Š” 18 ์ž…๋ ฅ

    INSERT INTO CUSTOMER(ID,PWD,NAME,MOBILE) VALUES('zman','ok','ํ•œ๊ตญ', '011');

    โ‘ข MOBILE ์ปฌ๋Ÿผ์—๋Š” UNIQUE KEY ์ œ์•ฝ์‚ฌํ•ญ์ด ์ •์˜๋˜์—ˆ์ง€๋งŒ NULL ํ—ˆ์šฉ.

    INSERT INTO CUSTOMER(ID,PWD,NAME) VALUES('xman','ok','king');

    โ‘ฃ ID์ค‘๋ณต์œผ๋กœ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. SQL ์˜ค๋ฅ˜: ORA-00001: ๋ฌด๊ฒฐ์„ฑ ์ œ์•ฝ ์กฐ๊ฑด(SCOTT.CUSTOMER_ID_PK)์— ์œ„๋ฐฐ๋ฉ๋‹ˆ๋‹ค

    1. 00000 - "unique constraint (%s.%s) violated"
    INSERT INTO CUSTOMER(ID,PWD,NAME) VALUES('xman','power','zzang');

    โ‘ค ๋ฐ์ดํ„ฐ๋Š” ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•œ๋‹ค. 'xman' ์™€ 'Xman'์€ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋กœ ์ค‘๋ณต ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

    INSERT INTO CUSTOMER(ID,PWD,NAME) VALUES('Xman','korea','dbzzang');

    โ†’ ๋Œ€์†Œ๋ฌธ์ž ์ค‘๋ณต ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•?

    โ‘ฅ VALUES์ ˆ์— ํ•จ์ˆ˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค, ID ์ค‘๋ณต์œผ๋กœ ๋ฌด๊ฒฐ์„ฑ ์œ„๋ฐ˜ ์—๋Ÿฌ ๋ฐœ์ƒ

    INSERT INTO CUSTOMER(ID,PWD,NAME) VALUES(lower('xMan'),'ok','zzang');

    โ†’ ์‚ฌ์šฉ์ž ์ž…๋ ฅํ•œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ํ•จ์ˆ˜ ์ฒ˜๋ฆฌ (DBMS level์—์„œ ์ฟผ๋ฆฌ ์ด์šฉ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ ์ฒ˜๋ฆฌ)

    ๐Ÿ’ก
    ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ, DBMS ๋ ˆ๋ฒจ ์—์„œ์˜ ์ฒ˜๋ฆฌ?

    โ‘ฆ INSERT์‹œ ์ปฌ๋Ÿผ ์ƒ๋žต์‹œ ํ•ด๋‹น ์ปฌ๋Ÿผ์— ์•”์‹œ์  NULL์ด ์ง€์ •๋œ๋‹ค. PRIMARY KEY๋Š” NULL์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. SQL ์˜ค๋ฅ˜: ORA-01400: NULL์„ ("SCOTT"."CUSTOMER"."ID") ์•ˆ์— ์‚ฝ์ž…ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

    INSERT INTO CUSTOMER(PWD,NAME) VALUES('ok','kim');
    • ์กด์žฌ์„ฑ ๋•Œ๋ฌธ์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ

    โ‘ง PRIMARY KEY์˜ ์œ ์ผ์„ฑ(UNIQUENESS) ๊ณผ ์กด์žฌ์„ฑ(NOT NULL)์„ ์œ„๋ฐ˜ ํ•˜๋Š” ๊ฒฝ์šฐ UPDATE ๋ช…๋ น์ด ์ˆ˜ํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.

    UPDATE CUSTOMER SET ID = NULL; -- ์กด์žฌ์„ฑ(NOT NULL)
    UPDATE CUSTOMER SET ID = 'XMAN'; -- ์œ ์ผ์„ฑ(UNIQUENESS) / ๊ณ ์œ ์„ฑ ์œ„๋ฐฐ

    โ‘จ

    1) USER_CONSTRAINTS๋Š” ์‚ฌ์šฉ์ž ์†Œ์œ (Owner)์˜ ๋ชจ๋“  ์ œ์•ฝ์‚ฌํ•ญ(CONSTRAINT)๋ฅผ ์กฐํšŒ ํ• ์ˆ˜ ์žˆ๋‹ค.

    SELECT * FROM USER_CONSTRAINTS;

    2) USER_CONS_COLUMNS๋Š” ์ œ์•ฝ์‚ฌํ•ญ์— ๊ด€๋ จ๋œ ์ปฌ๋Ÿผ(COLUMN)์˜ ์ •๋ณด๋ฅผ ์กฐํšŒํ• ์ˆ˜ ์žˆ๋‹ค.

    SELECT * FROM USER_CONS_COLUMNS;

    3) USER_INDEXES๋Š” ์‚ฌ์šฉ์ž ์†Œ์œ (Owner)์˜ ๋ชจ๋“  ์ธ๋ฑ์Šค(INDEX)๋ฅผ ์กฐํšŒ ํ• ์ˆ˜ ์žˆ๋‹ค

    SELECT * FROM USER_INDEXES;

    4) USER_IND_COLUMNS๋Š” ์ธ๋ฑ์Šค์— ๊ด€๋ จ๋œ ์ปฌ๋Ÿผ(COLUMN)์˜ ์ •๋ณด๋ฅผ ์กฐํšŒํ• ์ˆ˜ ์žˆ๋‹ค.

    SELECT * FROM USER_IND_COLUMNS;

    ๊ฐœ๋ฐœ์ด๋‚˜ ํŠœ๋‹์‹œ ๋นˆ๋ฒˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ฒŒ๋จ์œผ๋กœ ์‹ค์Šต์„ ํ†ตํ•ด ์ตํ˜€๋‘์–ด์•ผ ํ•œ๋‹ค.

    Foreign Key

    ๐Ÿ’ก
    Foreign Key
    • ์—ฐ๊ด€์„ฑ ์žˆ๋Š” ํ…Œ์ด๋ธ”๊ฐ„(๋‚ด) ์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ(Referential Integrity) ๋ณด์žฅ.
    • ์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ์ด๋ž€ ํ…Œ์ด๋ธ” ์‚ฌ์ด์˜ ๊ด€๊ณ„์—์„œ ๋ฐœ์ƒํ•œ๋‹ค. ์ด์ „ ์˜ˆ์ œ๋ฅผ ๋ณด๋ฉด ๋ถ€์„œ ํ…Œ์ด๋ธ”๊ณผ ์‚ฌ์› ํ…Œ์ด๋ธ”์€ ๋ถ€์„œ๋ฒˆํ˜ธ๋ผ๋Š” ๊ณตํ†ต์˜ ๋ฐ์ดํ„ฐ ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ๊ด€๊ณ„ ํ˜•์„ฑ.
    • ๋ถ€์„œ๋ฒˆํ˜ธ ์†์„ฑ(P.K or U.K)์€ ์›๋ž˜ ๋ถ€์„œ ๊ฐœ์ฒด(ํ…Œ์ด๋ธ”)์—์„œ ์ •์˜ ๋œํ›„ ์‚ฌ์› ๊ฐœ์ฒด(ํ…Œ์ด๋ธ”)์™€ ๊ด€๊ณ„๋ฅผ ํ˜•์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์› ๊ฐœ์ฒด(ํ…Œ์ด๋ธ”)์—๊ฒŒ ์ƒ์†๋œ(๋น„์‹๋ณ„๊ด€๊ณ„) ์†์„ฑ. *๊ฐ ํ…Œ์ด๋ธ”์— ์กด์žฌํ•˜๋Š” ๊ณตํ†ต๋œ ๋ฐ์ดํ„ฐ ์†์„ฑ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์ด ์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ ์ œ์•ฝ ์‚ฌํ•ญ.

    โ‘ 

    CREATE TABLE ๋ถ€์„œ(๋ถ€์„œ๋ฒˆํ˜ธ VARCHAR2(2) CONSTRAINT ๋ถ€์„œ_๋ถ€์„œ๋ฒˆํ˜ธ_PK PRIMARY KEY,
    									๋ถ€์„œ๋ช… VARCHAR2(10) CONSTRAINT ๋ถ€์„œ_๋ถ€์„œ๋ช…_NN NOT NULL
    );
    
    
    CREATE TABLE ์‚ฌ์›(์‚ฌ๋ฒˆ VARCHAR2(8) PRIMARY KEY,
    									์ด๋ฆ„ VARCHAR2(10),
    									๋ถ€์„œ๋ฒˆํ˜ธ VARCHAR2(2) , -- Table Level ์ œ์•ฝ์‚ฌํ•ญ
    									CONSTRAINT ์‚ฌ์›_๋ถ€์„œ_๋ถ€์„œ๋ฒˆํ˜ธ_FK FOREIGN KEY(๋ถ€์„œ๋ฒˆํ˜ธ)
    											REFERENCES ๋ถ€์„œ(๋ถ€์„œ๋ฒˆํ˜ธ) [ON DELETE CASCADE | SET NULL]
    );

    โ‘ก DESCRIBE ๋ถ€์„œ // not null , ์ถ•์•ฝ

    desc ์‚ฌ์›
    
    SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE,
    			 TABLE_NAME,SEARCH_CONDITION,R_CONSTRAINT_NAME,DELETE_RULE,STATUS
    FROM USER_CONSTRAINTS
    WHERE TABLE_NAME IN ('๋ถ€์„œ','์‚ฌ์›');
    -- CONSTRAINT_NAME, CONSTRAINT_TYPE, R_CONSTRAINT_NAME,DELETE_RULE ๊ด€์ฐฐ

    โ‘ข ๋ถ€์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌ ํ•˜์ง€ ์•Š๋Š” ์ƒํ™ฉ์—์„œ ์‚ฌ์› ์ •๋ณด ์ž…๋ ฅ์‹œ ์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ ์—๋Ÿฌ ๋ฐœ์ƒ

    INSERT INTO ์‚ฌ์›(์‚ฌ๋ฒˆ,์ด๋ฆ„,๋ถ€์„œ๋ฒˆํ˜ธ) VALUES('XMAN', 'TUNER','10');
    • SQL ์˜ค๋ฅ˜: ORA-02291: ๋ฌด๊ฒฐ์„ฑ ์ œ์•ฝ์กฐ๊ฑด(SCOTT.์‚ฌ์›_๋ถ€์„œ_๋ถ€์„œ๋ฒˆํ˜ธ_FK)์ด ์œ„๋ฐฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ถ€๋ชจ ํ‚ค๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค

    INSERT INTO ๋ถ€์„œ(๋ถ€์„œ๋ฒˆํ˜ธ,๋ถ€์„œ๋ช…) VALUES('10','๊ด€๋ฆฌ'); -- ๋ถ€์„œ(Parent data) ์ •๋ณด ์ž…๋ ฅ
    INSERT INTO ๋ถ€์„œ(๋ถ€์„œ๋ฒˆํ˜ธ,๋ถ€์„œ๋ช…) VALUES('20','์ „์‚ฐ');
    INSERT INTO ๋ถ€์„œ(๋ถ€์„œ๋ฒˆํ˜ธ,๋ถ€์„œ๋ช…) VALUES('50','์˜์—…');

    โ‘ฃ 10๋ฒˆ,20๋ฒˆ ๋ถ€์„œ์— ๊ทผ๋ฌดํ•˜๋Š” ์‚ฌ์› // ์‚ฌ์›(Child data) ์ •๋ณด ์ž…๋ ฅ

    INSERT INTO ์‚ฌ์›(์‚ฌ๋ฒˆ,์ด๋ฆ„,๋ถ€์„œ๋ฒˆํ˜ธ) VALUES('XMAN','TUNER',10);
    INSERT INTO ์‚ฌ์›(์‚ฌ๋ฒˆ,์ด๋ฆ„,๋ถ€์„œ๋ฒˆํ˜ธ) VALUES('YMAN','DBA',20);

    โ‘ค 30๋ฒˆ ๋ถ€์„œ(์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ถ€์„œ)์— ๊ทผ๋ฌดํ•˜๋Š” ์‚ฌ์› ์ž…๋ ฅ์‹œ ์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ ์—๋Ÿฌ ๋ฐœ์ƒ

    INSERT INTO ์‚ฌ์›(์‚ฌ๋ฒˆ,์ด๋ฆ„,๋ถ€์„œ๋ฒˆํ˜ธ) VALUES('ZMAN', 'DEVELOPER',30);
    • SQL ์˜ค๋ฅ˜: ORA-02291: ๋ฌด๊ฒฐ์„ฑ ์ œ์•ฝ์กฐ๊ฑด(SCOTT.์‚ฌ์›_๋ถ€์„œ_๋ถ€์„œ๋ฒˆํ˜ธ_FK)์ด ์œ„๋ฐฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ถ€๋ชจ ํ‚ค๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค

    โ‘ฅ ๊ทผ๋ฌด์ž๊ฐ€ (Child data) ์—†๋Š” 50๋ฒˆ๋ถ€์„œ ํ์ง€

    DELETE FROM ๋ถ€์„œ WHERE ๋ถ€์„œ๋ฒˆํ˜ธ = 50;

    โ‘ฆ ๊ทผ๋ฌด์ž๊ฐ€ ์žˆ๋Š” 10๋ฒˆ๋ถ€์„œ ํ์ง€์‹œ ์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ์œผ๋กœ ์—๋Ÿฌ ๋ฐœ์ƒ.

    -- on delete

    โ“restrict (default)

    โ“‘ cascade(๋ถ€๋ชจ ๋ฐ์ดํ„ฐ ์‚ญ์ œ์‹œ ์ž์‹๋„ ์‚ญ์ œ)

    โ“’ set null (์ž์‹ ๋ฐ์ดํ„ฐ null ์ฒ˜๋ฆฌ)

    DELETE FROM ๋ถ€์„œ WHERE ๋ถ€์„œ๋ฒˆํ˜ธ = 10;
    • SQL ์˜ค๋ฅ˜: ORA-02292: ๋ฌด๊ฒฐ์„ฑ ์ œ์•ฝ์กฐ๊ฑด(SCOTT.์‚ฌ์›_๋ถ€์„œ_๋ถ€์„œ๋ฒˆํ˜ธ_FK)์ด ์œ„๋ฐฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ž์‹ ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋ฐœ๊ฒฌ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค SELECT * FROM ์‚ฌ์›; // ๋ฐ์ดํ„ฐ๊ด€์ฐฐ

    โ‘ง ๊ทผ๋ฌด์ž๊ฐ€ ์žˆ๋Š” 10๋ฒˆ๋ถ€์„œ ํ์ง€ ๋ฐฉ๋ฒ•์€? โ“ on delete restrict โž” ํ•ด๋‹น ๋ถ€์„œ ๊ทผ๋ฌด์ž๋ฅผ ํ‡ด์‚ฌ(DELETE)์ฒ˜๋ฆฌ ํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๋ถ€์„œ๋กœ ์ด๊ด€(UPDATE)ํ•˜๊ณ  ํ์ง€ํ•œ๋‹ค.

    UPDATE ์‚ฌ์› SET ๋ถ€์„œ๋ฒˆํ˜ธ=20 WHERE ๋ถ€์„œ๋ฒˆํ˜ธ=10;
    DELETE FROM ๋ถ€์„œ WHERE ๋ถ€์„œ๋ฒˆํ˜ธ = 10;


    โ“‘ on delete cascade DROP TABLE ์‚ฌ์›; CREATE TABLE ์‚ฌ์› ~ on delete cascade ์ƒ์„ฑํ›„ โ‘ก ~ โ‘ฆ ์žฌ ์‹คํ–‰ , โ‘ข ์ƒ๋žต

    โ“’ set null DROP TABLE ์‚ฌ์›; CREATE TABLE ์‚ฌ์› ~ on delete set null ์ƒ์„ฑํ›„ โ‘ก ~ โ‘ฆ ์žฌ ์‹คํ–‰ , โ‘ข ์ƒ๋žต



    Uploaded by N2T

    728x90
    ๋ฐ˜์‘ํ˜•

    'Computer Science > DB' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

    [SQL] Synonym  (0) 2023.04.20
    [SQL] Sequence  (0) 2023.04.20
    [SQL] JOIN  (0) 2023.04.20
    [SQL] SubQuery  (0) 2023.04.20
    [SQL] DML - TRANSACTION  (0) 2023.04.20

    ๋Œ“๊ธ€

Keydi's Tistory