mysql - 将父记录设置为空,以便删除子记录 : howto?

标签 mysql database-design

在父行上设置空值时如何删除子行(在删除级联上?)?

这是数据库设计。

表 A [id、b_id_1、b_id_2]

表B[id,其他字段...]

b_id_1 和 b_id_2 可以为 NULL

如果其中任何一个为null,则表示对应的FK没有B记录(有2条)

所以 (b_id_1,b_id_2) 可以是 (null,null)、(100, null)、(null, 100_or_any_other_number) 等

如何在一个 SQL 查询中将 b_id_1(或 b_id_2)设置为 null 并删除 B 中具有此 id 的所有行?

这两个表应该应用什么 FK 设计?

应该从表的角度执行查询!

是的,如果我们使用“On delete set null”并从 B 表中删除一条记录,它就会起作用。

但是查询必须只触及表!!

你看,mysql SQL语法中没有“从一行中删除字段值”这样的语句。

我们只能将其设置为NULL。

这就是我需要的。

有什么想法吗?

最佳答案

删除时设置为空

http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html

[CONSTRAINT [symbol]] FOREIGN KEY
    [index_name] (index_col_name, ...)
    REFERENCES tbl_name (index_col_name,...)
    [ON DELETE reference_option]
    [ON UPDATE reference_option]

reference_option:
    RESTRICT | CASCADE | SET NULL | NO ACTION

更新:如果您想从 A 表的角度进行操作(您到底为什么要这样做???),那么您无法绕过触发器,例如。克。

DELIMITER ;;

CREATE TRIGGER tau_A AFTER UPDATE ON A
FOR EACH ROW    
BEGIN
    IF OLD.b_id_1 IS NOT NULL AND NEW.b_id_1 IS NULL;
    THEN
        DELETE FROM B WHERE id = OLD.b_id_1;
    END IF;
    IF OLD.b_id_2 IS NOT NULL AND NEW.b_id_2 IS NULL;
    THEN
        DELETE FROM B WHERE id = OLD.b_id_2;
    END IF;
END;;

无论如何,A中具有相同值的任何值都不会设置为NULL,因为您无法在MySQL中创建一个触发器来更改同一个表触发了触发器。

一般来说,如果你想要像这样奇怪的东西,我可以断言你的数据库设计很有可能是有缺陷的。如果您提供更多详细信息,我也许可以提出更好的建议。

关于mysql - 将父记录设置为空,以便删除子记录 : howto?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2661530/

相关文章:

mysql - 仅在需要时使用自动递增

数据库设计: Default Address

mysql - MySQL是如何存储数据的

sql-server - 如何优化SQL表点对点距离数据的读取速度

mysql - 在 Bash 脚本中将 Linux 命令输出插入 MySQL

php - 如何查找表列值中是否包含数字并生成结果

mysql - 为 MySQL 数据库中的长 varchar 字段强制执行唯一值

mysql - 如何使用内部联接联合

MySQL - 多对多表 - 主键和重复项

mysql - 事件管理架构设计