我正在编写一个脚本,在将数据插入表之前检查唯一约束冲突。
忽略主键,有哪些变化?
2号变异是否有意义?它是在实践中使用还是被认为是糟糕的设计?
答案 0 :(得分:2)
根据您的商业模式,只是为了补充所有其他评论,是的,所有这些变体都是可行的和推荐的。商业模式驱动所有约束。以下面的例子为例:
create table employee (
id int primary key not null,
name varchar(50) not null,
ssn varchar(10) not null,
branch_id int not null,
in_branch_serial int not null,
constraint uq_name unique (name),
constraint uq_ssn unique (ssn),
constraint uq_employee_number unique (branch_id, in_branch_serial)
);
此表格包含:
id
是唯一的,因为它是主键。name
也是独一无二的,我们决定这样做。ssn
也是独一无二的。branch_id
+ in_branch_serial
组合是唯一的。同一分支上的员工将具有相同的branch_id
,但两列的组合将是唯一的。答案 1 :(得分:2)
您的问题中缺少的字词是KEY。表可以有零个,一个或多个键。在关系数据库中,表必须至少有一个密钥,但SQL DBMS允许没有密钥的表。
任何键都可以包含零个,一个或多个属性。键有时可以重叠 - 意味着一个键中的属性也是另一个键中的属性,尽管这是相对不寻常的。
键也可能没有属性。单例表就是这种情况 - 约束为(最多)一行的表。 Oracle中的DUAL系统表是一个众所周知的例子。遗憾的是,SQL不支持“空”键语法,但有一些解决方法用于实现相同的效果。
通常会针对已知的密钥检查数据。除非您的数据真的永远不会改变,否则从数据中导出密钥通常不是一项有用的练习。如果一个表只有10个(不可为空)属性,那么1024个可能的超级密钥中最多可能有252个密钥,因此检查所有可能性是一个相当困难的问题。