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"]
还有一个Relationship
table:["PersonID", "RelativeID", "Relation"]
- 一个人的工作等级只能是给定值之一:
私有,Self-emp-not-inc 和其他一些值
- 一个人的年龄必须大于他的child。
- parent 必须至少 12 岁
- 男人挣的钱不能比老婆多
我的第一个想法是在我的客户端的代码级别检查这些东西,但我想有更好的方法可以用纯 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
同样,您的上述程序的一部分。
第一次使用 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"]
还有一个Relationship
table:["PersonID", "RelativeID", "Relation"]
- 一个人的工作等级只能是给定值之一: 私有,Self-emp-not-inc 和其他一些值
- 一个人的年龄必须大于他的child。
- parent 必须至少 12 岁
- 男人挣的钱不能比老婆多
我的第一个想法是在我的客户端的代码级别检查这些东西,但我想有更好的方法可以用纯 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
同样,您的上述程序的一部分。