Goo*_*bot 11 mysql innodb foreign-key
在数据库结构中
CREATE TABLE Country (
name varchar(40) NOT NULL,
PRIMARY KEY (name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE City (
name varchar(40) NOT NULL,
PRIMARY KEY (name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE Map (
country varchar(40) NOT NULL,
city varchar(100) NOT NULL,
PRIMARY KEY (country,city),
FOREIGN KEY (country) REFERENCES Country (name) ON DELETE CASCADE,
FOREIGN KEY (city) REFERENCES City (name) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)
我希望City
通过这三个相等的命令完整保留 child 中的相应值来删除 parent
FOREIGN KEY (city) REFERENCES City (name) ON DELETE NO ACTION
FOREIGN KEY (city) REFERENCES City (name) ON DELETE RESTRICT
FOREIGN KEY (city) REFERENCES City (name)
Run Code Online (Sandbox Code Playgroud)
但是当使用NO ACTION
ORRESTRICT
或省略ON DELETE
. MySQL 不允许我从父列中删除此错误:
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails
('test'.'Map', CONSTRAINT 'Map_ibfk_2' FOREIGN KEY ('city') REFERENCES 'City'('name')
ON DELETE RESTRICT
Run Code Online (Sandbox Code Playgroud)
我哪里错了?NO ACTION
删除父级并留下子级孤儿不是 SQL 的责任吗?
Rol*_*DBA 13
• RESTRICT:拒绝父表的删除或更新操作。指定 RESTRICT(或 NO ACTION)与省略 ON DELETE 或 ON UPDATE 子句相同。
至于没有行动
• NO ACTION:标准SQL 中的关键字。在 MySQL 中,相当于 RESTRICT。如果引用的表中有相关的外键值,InnoDB 会拒绝父表的删除或更新操作。一些数据库系统有延迟检查,NO ACTION 是延迟检查。在 MySQL 中,立即检查外键约束,因此 NO ACTION 与 RESTRICT 相同。
DELETE RESTRICT 保护父项不被删除,而不是子项。
如果您想删除父项并留下子项,那么您可能需要以下ON DELETE SET NULL
选项:
SET NULL:从父表中删除或更新行,并将子表中的外键列或列设置为NULL。支持 ON DELETE SET NULL 和 ON UPDATE SET NULL 子句。
如果您指定 SET NULL 操作,请确保您没有将子表中的列声明为 NOT NULL。
最后一句中有很多“不是”,所以只要确保 parent_id可以为 NULL。
另请参阅此相关问题:删除/更新外键约束中 SET NULL 的目的是什么?
通过定义外键,您已经告诉数据库不要接受子表中在父表中没有相应值的条目。
归档时间: |
|
查看次数: |
45147 次 |
最近记录: |