Mysql 외래키 삭제 - mysql oelaeki sagje

티스토리 뷰

DataBase/MySQL

[MySql] 외래키 무시하고 데이터 추가 및 수정 삭제 하기

IT공부블로그 2020. 11. 16. 11:38

728x90

반응형

-- 외래키 체크 중지

set foreign_key_checks = 0;

할거하고

-- 외래키 체크 시작

set foreign_key_checks = 1;

위 명령어는 그냥 그대로 치면 됨

출처 : https://nenara.tistory.com/188

728x90

반응형

저작자표시 비영리 변경금지

'DataBase > MySQL' 카테고리의 다른 글

[MySQL] error code 1129  (0)2022.01.12
[MySQL] DELETE + JOIN 쿼리 사용법  (0)2021.12.02
[MySQL] Syntax Error 발생경우  (0)2020.10.26
[MySQL] 소수점에 0 제거  (2)2020.06.16
[MySQL] 특정 테이블을 어느 특정 테이블의 컬럼값으로 값을 변경시키는 방법  (0)2020.01.08

댓글

    댓글쓰기 폼

    비밀글

    1 개요[ | ]

    MySQL 외래키 적용 테이블 삭제
    • 외래키가 적용된 테이블은 외래키로 인해 drop table 명령으로 테이블이 삭제 되지 않는다.

    2 예시 1: 외래키 적용된 테이블 삭제 (실패)[ | ]

    mysql> drop table users;
    ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails
    

    3 예시 2: 외래키 해제 후 테이블 삭제 (성공)[ | ]

    mysql> SET foreign_key_checks = 0;
    Query OK, 0 rows affected (0.00 sec)
    mysql> drop table users;
    Query OK, 0 rows affected (0.00 sec)
    mysql> SET foreign_key_checks = 1;
    Query OK, 0 rows affected (0.00 sec)
    

    4 같이 보기[ | ]

    • MySQL DROP TABLE
    • MySQL foreign_key_checks
    • 외래키

    ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails

    위와 같은 에러를 만나게 되면 데이터를 추가/삭제하거나 테이블을 변경하려고 할 때 외래키 설정때문에 수정이 안되는 경우가 발생한다.

    우리는 아래와 같은 방법으로 문제를 해결할 수 있다.

    -- 왜래키 체크중지
    SET foreign_key_checks = 0;
    
    -- 필요한 작업 실행
    drop table TABLENAME
    
    -- 왜래키 체크시작
    SET foreign_key_checks = 1;


    ✍️ Study Note

    Mysql 외래키 삭제 - mysql oelaeki sagje

    1. 테이블 삭제

    • DROP TABLE 테이블이름
    • FOREIGN KEY 제약조건의 기준테이블은 삭제 불가. (제약조건 or 외래키 테이블 선삭제 필요)

    2. 테이블 수정

    • ALTER TABLE 테이블이름 '수정 조건'
    • '수정 조건' 종류 : ADD COLUMN, ADD CONSTRAINT, ADD INDEX, DROP CHECK, DROP PRIMARY KEY 등

    (1) 열 추가

    • ALTER TABLE 테이블이름 ADD 열이름 
    USE TABLEDB;
    ALTER TABLE USERTBL
    	ADD HOMEPAGE VARCHAR(30) -- 열 추가
    		DEFAULT 'WWW.HANBIT.CO.KR' -- 디폴드값 추가
            NULL; -- NULL 허용

    (2) 열 삭제

    • ALTER TABLE 테이블이름 DROP 열이름
    • 해당 열에 제약조건이 있을 경우, 제약조건 선삭제 필요
    ALTER TABLE USERTBL
    	DROP MOBILE1;

    2-1. 행 삭제

    • DELETE FROM 테이블이름 WHERE 조건
    DELETE FROM BUYTBL WHERE USERID = 'BBK';

    (3) 열 수정 (열 이름 or 데이터형식 변경)

    • ALTER TABLE 테이블이름 CHAGE COLUMN 열이름
    • 해당 열에 제약조건이 있을 경우, 제약조건 선삭제 필요
    ALTER TABLE USERTBL
    	CHANGE COLUMN NAME UNAME VARCHAR(20) NULL;

    3-1. 데이터 수정

    • UPDATE 테이블이름 SET 바꿀내용 WHERE 조건
    UPDATE USERTBL SET BIRTHYEAR = 1971 WHERE USERID = 'JYP';

    (4) 제약조건 추가, 삭제

    • ALTER TABLE 테이블이름 ADD CONSTRATIN 제약조건이름 [PRIMARY KEY, FOREIGN KEY, CHECK] 조건
    • ALTER TABLE 테이블이름 DROP [PRIMARY KEY, FOREIGN KEY, CHECK] 제약조건 이름
    • 제약조건 이름은 Navigator - Schemas 트리에서 확인할 수 있다.
    -- 제약조건 추가
    ALTER TABLE USERTBL
    	ADD CONSTRAINT CK_BIRTHYEAR
        CHECK ((BIRTHYEAR >= 1900 AND BIRTHYEAR <=2023) AND (BIRTHYEAR IS NOT NULL));
    
    -- 제약조건 삭제
    ALTER TABLE USERTBL
    		DROP CHECK CK_NAME;

    4-1. 제약조건 활성화 / 비활성화

    • SET FOREIGN_KEY_CHECKS = 0 or 1
    SET FOREIGN_KEY_CHECKS = 0; -- 제약조건 잠시 끄기
    INSERT INTO BUYTBL VALUES (NULL, 'BBK', '모니터', '전자', 200, 5); -- 제약조건에 상관없이 데이터 입력
    SET FOREIGN_KEY_CHECKS = 1; -- 제약조건 다시 시작

    4-2. 제약조건 자동 업데이트 

    • ON UPDATE CASCADE : 기존테이블 데이터 변경 시, 제약조건 테이블 데이터도 자동 변경
    • ON DELETE CASCADE : 기존테이블 데이터 삭제 시, 제약조건 테이블 데이터도 자동 삭제
    -- 제약조건 자동업데이트 설정
    ALTER TABLE BUYTBL
    ADD CONSTRAINT FK_USERTBL_BUYTBL
    FOREIGN KEY (USERID) REFERENCES USERTBL(USERID)
    ON UPDATE CASCADE
    ON DELETE CASCADE;
    
    -- USERTBL 수정 시, BUYTBL 자동 수정
    UPDATE USERTBL SET USERID = 'VVK' WHERE USERID = 'BBK';
    SELECT USERID FROM BUYTBL WHERE USERID = 'VVK';
    
    -- USERTBL 삭제 시, BUYTBL 자동 삭제
    DELETE FROM USERTBL WHERE USERID = 'VVK';
    SELECT USERID FROM BUYTBL WHERE USERID = 'VVK';