第一次使用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"]
我的第一个想法是在我的客户端的代码级别检查那些东西,但我想有更好的方法来实现这个纯sql。
我想用这些约束创建表,但我对oracle SQL
一无所知答案 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岁
再次,上述程序的一部分。
- 一个男人的收入不能超过他的妻子
再次,上述程序的一部分。