【问题标题】:Oracle SQL create tables with some constraintsOracle SQL 创建具有一些约束的表
【发布时间】:2017-11-19 04:34:54
【问题描述】:

第一次使用 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 一无所知

【问题讨论】:

  • “男人的收入不能超过他的妻子”。我们在哪个世纪?
  • @Gordon 让我觉得这是一个家庭作业之类的 .. :) 即奇怪的标准,以便生成一个特定的逻辑案例来“练习”:)
  • 通过表约束,无法达到你想要的效果。要么实施程序来执行这些验证,要么使用触发器。
  • @Ditto 。 . .它实际上作为家庭作业更加尴尬。技术任务不应该传播这种刻板印象。
  • 如果您对 Oracle 一无所知,请开始阅读。你可以阅读Data Integrity here

标签: sql oracle constraints create-table


【解决方案1】:

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

  • 一个人的工作类别只能是给定值之一:Private、Self-emp-not-inc 和少数其他值

设置另一个名为“workclass_type”的表 使用以下数据:

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

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

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

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

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

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

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

(当我说程序时,我的意思是包中的程序..更容易..再次..我会让你发现 现在你有了术语):)

  • 父母必须年满 12 岁

再次,您的上述过程的一部分。

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

再次,您的上述过程的一部分。

【讨论】:

  • 谢谢!这足以让我继续前进
猜你喜欢
  • 2013-05-21
  • 1970-01-01
  • 2015-12-10
  • 2021-06-11
  • 1970-01-01
  • 2022-06-03
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
相关资源
最近更新 更多