2017-06-16 20 views
0

Oracle SQL首次使用Oracle DB创建有一些限制的表

我开始有一个非常基本的Person表: ["ID", "Age", "Workclass", "fnlwgt", "Education", "Education-Num", "Martial Status", "Occupation", "Relationship", "Race", "Sex", "Capital Gain", "Capital Loss", "Hours per week", "Country", "Target"]

而且一个Relationship表:["PersonID", "RelativeID", "Relation"]

  • 一个人的workclass只能在给定值之一: 私人,自我实现而非其他价值
  • 人的年龄必须大于他的孩子。
  • 父母必须至少12岁
  • 的人是不能赚的比他的妻子更

我首先想到的是要检查这些东西在我的客户端的代码级,但我想有更好的用纯sql实现这一点的方法。

我想创建这些约束的表,但我真的一无所知的Oracle SQL

+0

“一个男人赚不了他的妻子”。我们在哪个世纪? –

+0

@戈登让我觉得这是一个家庭作业或什么.. :)即奇怪的标准,以生成一个特定的逻辑情况下“实践”:) – Ditto

+0

通过表约束,你不能达到你想要的。要么执行过程来执行这些验证,要么使用触发器。 –

回答

0

,以满足您的标准。我想尝试以下操作:

  • 的的workclass人只能在给定值中的一个:私人自EMP-不-INC和其他一些价值观

设置另一个表,命名为“ workclass_type” 数据如下:

ID WorkClass_Name 1私人 2自EMP 3 .... ,你需要的任何其他值。

将Person表上的“workclass”列更改为“workclass_ID” ,并在该表中指向该列的FK,指向workclass_type中的ID col。

这被称为参照约束(或外键 - 同一件事)。它告诉Oracle将选择限制在其他表中的内容。 这对节省空间非常有用(除其他外),因为您不会在每一行上存储完整的字符串名称,只是一个小的数字ID。

可以/应该通过填充序列中的ID列...但我会让你发现;)

  • 一个人的年龄必须比他的孩子大。

不容易通过限制做...你可以通过触发做到这一点,但是,我不会建议它..触发 有自己的一套的问题,往往会导致更大的问题。 我推荐一个存储过程(如Renato在评论中所建议的那样)。

创建一个INS程序..并强制每个人通过该程序进来。 换句话说,不要将表暴露给INS/UPD ...,而是暴露过程。

(当我说过程,我指的是包内的程序.. ..更容易再次..我让你发现 既然已经术语):)

  • 父母必须至少12岁
再次

,你上面的程序的一部分。

  • 一个人不能赚取更多的比他的妻子

再次,你上面的程序的一部分。

+0

谢谢!这对我来说足够了 –