반응형
MariaDB "ON UPDATE CASCADE" 제약 조건이 예상대로 작동하지 않습니까?
나는 그것을 예상했습니다.ON UPDATE CASCADE
제약은 내가 참조된 외국 키의 값을 업데이트하고 그것을 심판에게 캐스케이드할 수 있게 할 것입니다(포스트그레에서처럼).SQL), 하지만 그렇지 않은 것 같습니다.
내가 뭘 빼놓았나요?
여기서 MariaDB 10.3.29-MariaDB-0ubuntu0을 사용합니다.20.04.1
CREATE TABLE category (
id int(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
parent_id int(11) UNSIGNED DEFAULT NULL,
slug varchar(255) NOT NULL,
title varchar(255) NOT NULL,
content longtext NOT NULL,
created_at datetime NOT NULL DEFAULT current_timestamp(),
updated_at datetime DEFAULT NULL,
CONSTRAINT fk_category_parent_id FOREIGN KEY (parent_id) REFERENCES category (id) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `category` (`id`, `parent_id`, `slug`, `title`, `content`, `created_at`, `updated_at`) VALUES
(1, NULL, 'non-classe', 'Non Classé', '', '2021-05-30 16:46:52', NULL),
(2, NULL, 'cours', 'Cours', '', '2021-05-30 16:47:38', NULL),
(3, 2, 'mysql', 'MySQL', '', '2021-05-30 16:48:18', NULL),
(4, 3, 'initiation-mysql', 'Cours initiation MySQL', '', '2021-05-30 16:49:09', NULL);
UPDATE category SET id = 12 WHERE id = 2;
-- ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`cours_cms`.`category`, CONSTRAINT `fk_category_parent_id` FOREIGN KEY (`parent_id`) REFERENCES `category` (`id`) ON UPDATE CASCADE)
이 페이지의 설명을 참조하십시오.
https://mariadb.com/kb/en/foreign-keys/
ON UPDATE CASCADE가 캐스케이드 중에 이전에 업데이트한 것과 동일한 테이블을 다시 업데이트하면 RESTRICT처럼 작동합니다.즉, 자체 참조 ON UPDATE CASCADE 작업을 사용할 수 없습니다.이는 계단식 업데이트로 인한 무한 루프를 방지하기 위한 것입니다.
즉, ON UPDATE CASCADE는 계층형 데이터 유형의 테이블이면 작동하지 않습니다.
Postgre에서 이것이 작동한다는 것을 확인하는 것.'무한 루프'가 없는 SQL
CREATE TABLE category (
id SERIAL PRIMARY KEY,
parent_id int DEFAULT NULL,
slug varchar(255) NOT NULL,
title varchar(255) NOT NULL,
content text NOT NULL,
CONSTRAINT fk_category_parent_id FOREIGN KEY (parent_id) REFERENCES category (id) ON DELETE RESTRICT ON UPDATE CASCADE
);
INSERT INTO category (id, parent_id, slug, title, content) VALUES
(1, NULL, 'non-classe', 'Non Classé', ''),
(2, NULL, 'cours', 'Cours', ''),
(3, 2, 'mysql', 'MySQL', ''),
(4, 3, 'initiation-mysql', 'Cours initiation MySQL', '');
UPDATE category SET id=12 WHERE id=2;
SELECT * FROM category;
id | parent_id | slug | title | content
----+-----------+------------------+------------------------+---------
1 | | non-classe | Non Classé |
4 | 3 | initiation-mysql | Cours initiation MySQL |
12 | | cours | Cours |
3 | 12 | mysql | MySQL |
이것이 라벨 코드에서 제 문제를 해결한 것입니다.
제가 바꿨습니다.
$table->foreign('user_id')->references('id')->on('users')->onUpdate('cascade')->onDelete('cascade̥');
대상:
$table->foreign('user_id')->references('id')->on('users')->cascadeOnUpdate()->cascadeOnDelete();
언급URL : https://stackoverflow.com/questions/67765874/mariadb-on-update-cascade-constraint-not-working-as-expected
반응형
'programing' 카테고리의 다른 글
Spring Boot: @Value는 항상 null을 반환합니다. (0) | 2023.06.30 |
---|---|
dplyr을 사용하여 그룹별 행 수 계산 (0) | 2023.06.30 |
sys.stdout을 로그 파일로 복제하는 방법은 무엇입니까? (0) | 2023.06.30 |
파일 존재 확인 방법 (0) | 2023.06.30 |
Python에서 파일 해싱 (0) | 2023.06.30 |