일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- getDateCellValue
- MSSQL
- load order
- @CreateDate
- 오블완
- 버전 문자열 비교
- yml
- NamedEntityGraph
- @EntityListeners
- 1*1000
- deserializer
- mysql equal null
- MYSQL
- createEntityGraph
- getEntityGraph
- pooled-lo
- EmbeddedId
- Protecle
- fractional seconds
- apatch poi
- spring boot
- mysql not equal null
- sendFractionalSeconds
- RootGraph
- +9:00
- 티스토리챌린지
- mysql =
- 운동해서 광명찾자
- https
- AuditingEntityListener
- Today
- Total
Hello
MySQL FK on update, on delete 본문
CREATE TABLE `tb_t1` (
`id` INT(11) NOT NULL,
`key` VARCHAR(50) NOT NULL COLLATE 'utf8_general_ci',
PRIMARY KEY (`id`) USING BTREE
)
ENGINE=InnoDB;
CREATE TABLE `tb_t2` (
`id` INT(11) NOT NULL,
`some_value1` INT(11) NOT NULL,
`some_value2` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8_general_ci',
PRIMARY KEY (`id`) USING BTREE,
CONSTRAINT `FK__tb_t1` FOREIGN KEY (`id`) REFERENCES `settlement`.`tb_t1` (`id`)
)
ENGINE=InnoDB;
위 쿼리의 테이블에 상위 테이블(T1 데이터를 지울 때 아래 쿼리 실행 시 아래 에러를 반환합니다.
DELETE t1, t2
FROM tb_t1 t1
INNER JOIN tb_t2 ON t1.id = t2.id
WHERE t2.key;
FK on update, on delete를 명시 하지 않을 경우 NO ACTION을 기본값으로 사용하게 되지만, mysql의 경우 RESTRICT으로 생성됩니다.
RESTRICT로 FK가 생성된 경우 상위 테이블에 대한 작업을 할 수 없어 FK on delete 옵션을 CASCADE로 변경해 사용하도록 합니다.
ALTER TABLE `tb_t2`
DROP FOREIGN KEY `FK__tb_t1`;
ALTER TABLE `tb_t2`
ADD CONSTRAINT `FK__tb_t1` FOREIGN KEY (`id`) REFERENCES `settlement`.`tb_t1` (`id`) ON UPDATE CASCADE ON DELETE CASCADE;
reference option
RESTRICT : 상위 테이블에 대한 삭제 또는 업데이트 작업을 거부합니다.
NO ACTION : 표준 SQL의 키워드입니다. MySQ는 RESTRICT 사용.
MySQL은 참조 테이블에 관련 외래 키 값이 있는 경우 상위 테이블에 대한 삭제 또는 업데이트 작업을 거부합니다.
MySQL은 외래 키 제약 조건을 즉시 확인하므로 NO ACTION은 RESTRICT와 동일합니다.
일부 데이터베이스 시스템에는 지연 검사가 있으며 이는 NO ACTION지연 검사입니다.
CASCADE : 상위 테이블에서 행을 삭제, 업데이트하고 하위 테이블에서 일치하는 행을 자동으로 삭제, 업데이트합니다.
SET NULL : 상위 테이블에서 행을 삭제, 업데이트하고 하위 테이블의 외래 키 열을 NULL로 설정합니다.
SET DEFAULT : 이 작업은 MySQL 구문 분석기에 의해 인식되지만, InnoDB 와 NDB는 테이블 정의를 거부합니다.
참고 : https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html
'DB' 카테고리의 다른 글
조회 쿼리 sort 성능 개선 (0) | 2023.07.21 |
---|---|
MySQL delete 실행 시 Table disk size가 줄어들지 않음 (0) | 2023.05.18 |
REDIS SENTINEL (0) | 2023.03.09 |
mySql join을 사용해 update 할 때 (0) | 2022.10.24 |
[mysql] 한글 조회 깨짐 이슈 (0) | 2022.07.20 |