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

Oracle SQL create tables with some constraints

第一次使用 Oracle DB。

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

还有一个Relationshiptable:["PersonID", "RelativeID", "Relation"]

我的第一个想法是在我的客户端的代码级别检查这些东西,但我想有更好的方法可以用纯 sql.

我想创建具有这些约束的 table,但我对 Oracle 真的一无所知 SQL

为了满足您的标准..我会尝试以下操作:

  • The workclass of a person can be only one of the given values: Private, Self-emp-not-inc and few other values

设置另一个 table,名为 "workclass_type" 具有以下数据:

ID WorkClass_Name 1 个人 2 自雇 3 .... 以及您需要的任何其他值。

将 Person table 上的 "workclass" 列更改为 "workclass_ID" 并亲自在此列上创建一个 FK table 指向 workclass_type.

中的 ID col

这称为引用约束(或外键 - 同样的东西)。 它告诉 Oracle 将选择限制在另一个 table 中的内容。 这有利于 space 节省(除其他外),因为您不会在每一行上存储完整的字符串名称..只是一个小的数字 ID。

您可以/应该按顺序填充 ID 列...但我会让您发现这一点 ;)

  • A person age must be larger than his child.

不容易通过约束完成...您可以通过触发器完成,但是,我不建议这样做...触发器 他们有自己的一系列问题,而且往往会导致更大的问题。 我推荐一个存储过程(正如雷纳托在评论中所建议的那样)。

创建一个 INS 程序 .. 并强制每个人都通过该程序进入。 所以换句话说,不要将 table 公开给 INS/UPD ...而是公开过程。

(当我说过程时,我的意思是一个包中的过程..更容易..再次..我会让你发现 现在您已经掌握了术语):)

  • A parent must be at least 12 years old

同样,您的上述程序的一部分。

  • A man cannot earn more than his wife

同样,您的上述程序的一部分。