쌓고 쌓다

[SQL] 기준 테이블과 참조 테이블의 데이터 변경 본문

프로그래밍/SQL

[SQL] 기준 테이블과 참조 테이블의 데이터 변경

승민아 2022. 7. 19. 00:47

기준 테이블의 열이 변경될 경우

INSERT INTO member VALUES('BLK', '블랙핑크', 163);
INSERT INTO buy VALUES(NULL, 'BLK', '지갑');
INSERT INTO buy VALUES(NULL, 'BLK', '맥북');

member 테이블이 기준 테이블이며, buy 테이블은 참조 테이블이다.

 

내부 조인을 이용해 INSERT 결과 확인

SELECT M.mem_id, M.mem_name, B.prod_name
    FROM buy B
    INNER JOIN member M
    ON B.mem_id = M.mem_id;

 

 

이 상태에서 기준 테이블 member에 있는 회원 아이디 'BLK'를 'PINK'로 바꿔보자.

 

UPDATE member SET mem_id = 'PINK' WHERE mem_id='BLK';

Error Code: 1451. Cannot delete or update a parent row: a foreign key constraint fails

(`naver_db`.`buy`, CONSTRAINT `buy_ibfk_1` FOREIGN KEY (`mem_id`) REFERENCES `member` (`mem_id`))

기본 키- 외래 키로 맺어진 후에는 기준 테이블의 열 이름은 변경되지 않는다.

열 이름이 변경되면 참조 테이블의 데이터에 문제가 발생하기 때문이다.

물론, 삭제 또한 안된다.

DELETE FROM member WHERE mem_id='BLK';

 

 

+ 참조 테이블에 영향을 안주는 기준 테이블의 열 이름의 변경은 가능 ( 참조 테이블에 존재하지 않아도 기준T 변경가능 )

UPDATE member SET mem_name = '블랙핑크크' WHERE mem_id='BLK';

 

기준 테이블의 열 이름이 변경될때 참조 테이블의 열 이름 자동 변경

ON UPDATE CASCADE문을 이용한다. 또한 삭제시 반영되게하는것은 ON DELETE CACADE문이다.

CREATE TABLE buy
( 
    num INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
    mem_id CHAR(8) NOT NULL,
    prod_name CHAR(6) NOT NULL
);

ALTER TABLE buy
    ADD CONSTRAINT
    FOREIGN KEY(mem_id) REFERENCES member(mem_id)
    ON UPDATE CASCADE
    ON DELETE CASCADE;

 

다시 기준 테이블의 내용을 변경을 해보겠다.

UPDATE member SET mem_id='PINK' WHERE mem_id='BLK';

참조 테이블 또한 함께 변경이 되었다.

또한 다시 기준 테이블에 데이터를 삭제해보겠다.

DELETE FROM member WHERE mem_id='PINK';

그리고 참조 테이블의 모든 항목들을 검색해보겠다.

SELECT * FROM buy;

기준 테이블의 데이터를 지웠더니 참조 테이블에 같이 묶인 데이터도 함께 삭제되었다.

 

모든 내용은 '혼자 공부하는 SQL' 도서를 기반으로 학습 후 정리한 내용입니다. 

Comments