在 Oracle 中,假设有 3 个表,每个表都有主键和外键。所以,如果我要开始创建表格,我将如何开始。我开始使用主键和外键创建第一个表,但是当提到外键而不创建其他引用表时,它不允许我创建表。如果是这种情况,我无法创建任何这些表,因为我在所有 3 个表上都有外键,并且在每个表上都是主键。注意:是的,我知道我可以稍后添加约束。但我很想知道,这类问题在现实世界的编程中是如何工作的。开发人员稍后会添加外部约束还是只是好奇。
问问题
108 次
2 回答
2
您可以将外键约束声明为DEFERRABLE
,这允许您让 Oracle 在事务结束时检查约束。
SET TRANSACTION;
SET CONSTRAINTS ALL DEFERRED;
INSERT INTO TABLE_ONE (PK1, FK2, NAME)
VALUES(10, 20, 'Foo');
INSERT INTO TABLE_TWO (PK2, FK3, NAME)
VALUES(20, 30, 'Bar');
INSERT INTO TABLE_THREE (PK3, FK1, NAME)
VALUES(30, 10, 'Baz');
COMMIT;
在前两个INSERT
s 之后,都有一个没有引用的外键,但 Oracle 在提交之前不会检查。第三次插入后,一切都修复了。
你想要这个数据结构吗?
于 2013-05-09T02:37:17.490 回答
1
“假设有 3 个表,每个表都有主键和外键。”
在现实世界中这是不可能发生的。必须至少有一个表不依赖于任何其他表的外键。
事实上,它可能比这更复杂。大多数数据模型都有两种表:查找(或代码)表和业务数据表。必须至少有一个不依赖于任何其他业务数据表的业务数据表,一个位于树顶部的业务数据表。
“开发人员以后是否添加外部约束”
这取决于。一般来说,为不同类型的 DDL 提供单独的脚本是很有用的,所以是的,通常在一个过程中创建表,在另一个过程中构建索引,然后添加约束。如果数据库阶段包括数据加载,这种策略将是合适的。
但是如果交付的数据库是空的——除了查找数据——这些表可以在单个脚本中构建。在这种情况下,我们需要对脚本进行排序,以便我们首先构建没有外键依赖关系的表,然后构建它们的子表,然后是孙表,依此类推。
于 2013-05-09T04:43:33.017 回答