mysql - MYsql 中的子-父约束?

标签 mysql database constraints

我可以要吗?

如果删除来自不同表的相关行,我有一个强制删除行的约束:

node INT UNSIGNED NOT NULL,
id INT UNSIGNED NOT NULL AUTO_INCREMENT,   
name VARCHAR(20) NOT NULL,     
title VARCHAR(200) NOT NULL,
description MEDIUMTEXT,
category VARCHAR(20) NOT NULL,  
parent INT UNSIGNED DEFAULT 0,             # here is the parent term id
                                           # if it's 0 the term has no parent

PRIMARY KEY(id),
UNIQUE KEY(name, node, category),
KEY parent(parent),
KEY category(category),

CONSTRAINT terms FOREIGN KEY(node)
    REFERENCES nodes(id) ON DELETE CASCADE ON UPDATE RESTRICT

如果“父”项被删除,我想要另一个强制自动删除行的约束吗? (如果有term parent set)

例子:

node  |  id  |  name  | title   | description    | category | parent
___________________________________________________________________
534   |    1 |  A     | Foooooo | Bla bla...     | A        | 0 
54    |    2 |  B     | Foooooo | Bla bla...     | A        | 1
45    |    3 |  C     | Foooooo | Bla bla...     | A        | 2
545   |    4 |  D     | Foooooo | Bla bla...     | A        | 2
534   |    5 |  E     | Foooooo | Bla bla...     | A        | 1

所以条款看起来像:

  A
  - B
  --- C
  --- D
  - E

所以如果我删除 B,我希望 C 和 D 也被删除, 如果我删除A,那么B、C、D、E也应该被删除……

最佳答案

不存在“条件”约束这样的东西:您的父字段始终 引用另一行(即不允许为 0),或者根本没有约束。

这是一个非常正常的用例,通常您会在父级上使用 ON DELETE TRIGGER 解决它,这也会删除子级,由父级选择它们。

在您的示例中,您可能会考虑类似

CREATE TRIGGER cascade_delete_children 
    BEFORE DELETE ON node 
    FOR EACH ROW 
         DELETE FROM node WHERE parent=OLD.id;

关于mysql - MYsql 中的子-父约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9185941/

相关文章:

ios - 布局约束不起作用

ios - XCode 6.4 中的 iOS8 Storyboard 中缺少约束图标,适用于最初在 iOS 早期版本下编写的应用程序

algorithm - 多种背包变化

mysql - 如何从子查询中获取值

sql-server - 设置仅对特定用户可见的 SQL Server 数据库

Android:数据库导出适用于模拟器,不适用于手机

android - Room 在哪里保存数据库 Android?

php - Cron 作业执行 php 文件

MySQL-将字符串添加到文本列

php - 根据下一个字段中的值选择或不选择字段