首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MariaDB“在更新级联”约束不能按预期工作?

MariaDB“在更新级联”约束不能按预期工作?
EN

Stack Overflow用户
提问于 2021-05-30 21:14:13
回答 2查看 767关注 0票数 1

我原以为ON UPDATE CASCADE约束将允许我更新引用外键的值,并将其级联到它的裁判员(就像在PostgreSQL中那样),但情况似乎并非如此。

我漏掉了什么吗?

这里使用MariaDB 10.3.29-MariaDB-0ubuntu0.20.04.1

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-30 21:25:28

请参阅本页的评论:

https://mariadb.com/kb/en/foreign-keys/

--如果在UPDATE级联上递归更新以前在级联期间更新过的表,则它的作用类似于限制。这意味着不能在更新级联操作中使用自引用。这是为了防止由级联更新导致的无限循环。

换句话说,如果更新级联是一个层次数据类型的表,那么它就不能工作。

票数 1
EN

Stack Overflow用户

发布于 2021-05-30 21:52:54

只是在没有“无限循环”的PostgreSQL中确认了这一点。

代码语言:javascript
复制
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                  | 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67765874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档