Oracle SQL创建具有一些约束的表

时间:2017-06-16 11:49:48

标签: sql oracle constraints create-table

第一次使用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"]

  • 一个人的工作阶层只能是给定值之一: Private,Self-emp-not-inc和其他很少的值
  • 年龄必须大于他的孩子。
  • 父母必须年满12岁
  • 一个男人的收入不能超过他的妻子

我的第一个想法是在我的客户端的代码级别检查那些东西,但我想有更好的方法来实现这个纯sql。

我想用这些约束创建表,但我对oracle SQL

一无所知

1 个答案:

答案 0 :(得分:0)

符合您的标准..我尝试以下方法:

  
      
  • 一个人的工作阶层只能是给定值中的一个:私有,自我犯罪,少有其他价值
  •   

设置另一个表,名为" workclass_type" 以下数据:

ID WorkClass_Name 1私人 2自我 3 .... 以及你需要的其他任何价值。

更改您的工作类" Person表上的列到" workclass_ID" 并在person表中的此列上创建一个FK,指向workclass_type中的ID col。

这称为参照约束(或外键 - 同样的事情)。 它告诉Oracle将选择限制在该另一个表中的内容。 它可以节省空间(除其他外),因为你不会在每一行都存储完整的字符串名称......只是一个小的数字ID。

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

  
      
  • 年龄必须大于他的孩子。
  •   

不容易通过约束来完成......你可以通过触发器来做,但是,我不建议它。触发器 有自己的一套问题,往往会导致更大的问题。 我建议使用存储过程(正如Renato在评论中建议的那样)。

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

(当我说程序时,我指的是一个包内的程序..更容易..再次..我会让你发现那个 既然你有术语):)

  
      
  • 父母必须年满12岁
  •   

再次,上述程序的一部分。

  
      
  • 一个男人的收入不能超过他的妻子
  •   

再次,上述程序的一部分。