oracle中外键的作用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle中外键的作用相关的知识,希望对你有一定的参考价值。
参考技术A Oracle 外键约束例子:http://hi.baidu.com/wangzhiqing999/blog/item/6a79e3f4e10911bda40f52e8.html本回答被提问者采纳 参考技术B 外键约束
参照完整性,外键约束确定了表格或者视图的栏作为外键。这个外键栏和一个主键或者唯一键在另外一个表格中建立了直接的关系。这个表格包含的外键被引用做孩子,并且参考键被用做双亲表格。外键和参考键可以被用在同一个表格中。除此之外,双亲和子表必须在相同的数据库中。
下面是创建一个外键约束的语法:
ALTER TABLE (table_name)
ADD
CONSTRAINT (foreign key constraint name)
FOREIGN KEY
( field name )
REFERENCES primary_table_name
(primary_table_primary_index_field)
虽然外键约束通常被用在应用程序编码的场所来进行完整性的检查,但是使用参考完整性的约束加入到I/O开销中来执行insert和update操作是重要的。另外的I/O是可归于外键必须使双亲表有效的事实。通过保证参考列表被检索可使这个开销最小,在大量的重载中,它在使先前的完整约束丧失能力重载和在重载完成后使约束恢复能力的过程中非常有用。一旦约束被激活,任何错误都可被纪录和操作。
参照完整性有时候需要双重编码。比如,在多重SQL*Form中,你也许不知道参照完整性是否违反了规则直到你将许多页面放到表格中并且你的表格试图提交的事物元的时候。在Web服务器应用程序中,你需要非常小心的保证Oracle事物元的安全。
根据同一模型中的另一个外键动态限制 Django 模型中外键的选择
【中文标题】根据同一模型中的另一个外键动态限制 Django 模型中外键的选择【英文标题】:Dynamically limit choices for Foreignkey in Django models based on another foreign key in the same model 【发布时间】:2015-05-29 03:10:49 【问题描述】:我有这些模型:
class UserProfile(models.Model):
name = models.CharField(max_length=100)
class Dialog(models.Model):
belong_to = models.ManyToManyField(UserProfile)
class Message(models.Model):
# Dialog to which this message belongs
part_of = models.ForeignKey(Dialog)
# User who sends message
sender = models.ForeignKey(UserProfile, related_name='sender')
# User who receives message
receiver = models.ForeignKey(UserProfile, related_name='receiver')
我想要做的是限制发送者和接收者字段的选择,以便他们只能是整个对话框所属的用户。 我试过这个:
sender = models.ForeignKey(UserProfile,
related_name='sender',
limit_choices_to='dialog':1)
这限制了选择,但仅限于 id=1 的对话成员。我想知道这是否可以动态完成?
【问题讨论】:
【参考方案1】:如果Message
的实例都属于Dialog
,为什么不在Dialog
模型上创建一个字段messages
?然后,您可以将发送者和接收者附加到每个Dialog
。简而言之,大致如下:
class Dialog(models.Model):
messages = models.ManyToManyField(Message)
sender = models.ForeignKey(UserProfile)
receiver = models.ForeignKey(UserProfile)
class Message(models.Model):
# Other fields
Message 的发送者和接收者始终是 Dialog 所属的对象。
【讨论】:
这种想法是不可接受的,因为每条消息的发送者-接收者都是不同的。当我发布内容时——我是发件人,你是收件人,反之亦然。所以在同一个对话框中发送者-接收者可能会改变【参考方案2】:我不相信有任何方法可以像使用 limit_choices_to 那样动态过滤,因为您无法访问所需的对象来在那里形成这样的查询。
相反,您可能应该为消息创建自己的模型表单并在那里为这些字段设置查询集。像下面这样...
class MessageForm(forms.ModelForm):
class Meta:
model = Message
def __init__(self, *args, **kwargs):
super(MessageForm, self).__init__(*args, **kwargs)
if self.instance.part_of and self.instance.part_of.id:
users = self.instance.part_of.belong_to.all()
self.fields['sender'].queryset = users
self.fields['receiver'].queryset = users
此外,为什么 limit_choices_to
适用于您的示例,但在动态方面没有用处。
Django 只是将 limit_choices_to
表达式作为一个额外的过滤器处理,以应用于 ModelForm 字段查询集。您的表达式 dialog: 1
在语义上与在我的示例中将 UserProfile.objects.filter(dialog=1)
的结果分配给查询集时没有区别。
Django 不知道具有该 id 的对话框是否作为 UserProfile 上的关系存在,它只是应用过滤器。在这种情况下,存在一个 id 为 1 的对话框,因此可以正常工作。如果您在示例中粘贴了无效的对话框 id..它将评估为空查询集,您将在表单中获得 0 个选项。
它不能是动态的,因为在limit_choices_to
中您只能为 UserProfile 模型创建过滤器表达式。您无权访问该字段所属的 Message 实例,也无权访问该消息所属的 Dialog 模型...因此您无法创建过滤器来动态限制这些实例。
创建您自己的 ModelForm 并限制那里的字段的查询集,您可以在其中获得所需的信息,这是正确的方法。
【讨论】:
恐怕我必须这样做,但首先:它不是 forms.py 它的 models.py 和第二:它奇怪的是我可以用数字访问,所以它已经知道有这样的对话框对象,但不能动态地做( 我不知道你提到的 models.py vs forms.py 是什么。 更新了我的答案,以解释 limit_choices_to 如何工作/不按您想要的方式工作...... 好吧,似乎必须手动完成所有操作。无论如何感谢您的帮助)以上是关于oracle中外键的作用的主要内容,如果未能解决你的问题,请参考以下文章
根据同一模型中的另一个外键动态限制 Django 模型中外键的选择