我在旧考试中发现了以下两个SQL模式。考试似乎并没有坚持使用一种特定的SQL语法,但我希望这对于这个问题并不重要:ON DELETE RESTRICT
和只有外键而没有任何这样的触发条款有什么区别?< / p>
-- Schema B --
CREATE TABLE tab1 (
tab1_key INT
NOT NULL UNIQUE ) ;
CREATE TABLE tab2 (
tab2_ref INT NOT NULL,
FOREIGN KEY ( tab2_ref )
REFERENCES tab1 ( tab1_key ) ) ;
-- Schema C --
CREATE TABLE tab1 (
tab1_key INT
NOT NULL UNIQUE ) ;
CREATE TABLE tab2 (
tab2_ref INT NOT NULL,
FOREIGN KEY ( tab2_ref )
REFERENCES tab1 ( tab1_key )
ON DELETE RESTRICT
ON UPDATE NO ACTION ) ;
我认为这两个模式之间的唯一区别是模式C中的最后一行,但我找不到任何关于使用外键而没有任何附加约束的文档。这个假设是正确的吗?
我尝试在pgAdmin中尝试这些,但是该程序一直在失败(并且似乎以其错误而闻名)所以我认为这里要求比调试该工具更省力。
此外,请注意,虽然这些架构来自旧考试,但此问题与考试问题不同。否则我会看看解决方案。 这是不作业。
答案 0 :(得分:1)
来自Using Foreign Key constraints:
RESTRICT:拒绝父表的删除或更新操作。指定RESTRICT(或NO ACTION)与省略ON DELETE或ON UPDATE子句相同。
NO ACTION:标准SQL中的关键字。在MySQL中,等同于RESTRICT ...某些数据库系统具有延迟检查,NO ACTION是延迟检查。
(我强调)
事实上,除非您使用支持延迟约束的数据库系统,否则两者之间没有真正的区别。
答案 1 :(得分:0)
在Postgres和我使用过的所有其他DBMS中,默认的ON DELETE操作是RESTRICT。然而,这可能因DBMS和版本而不同,例如Microsoft SQL Server 2012及更早版本不支持RESTRICT。它也可能因DBMS配置而不同,例如: MySQL有一个设置foreign_key_checks
,可以禁用外键执行操作。所以你明智地验证。
在DBMS中创建两个表并测试其实际行为会很容易。