sql - 如何给数据库约束以确保表中的这种行为?

标签 sql database oracle

我有一个包含五列的表格:A、B、C、D 和 E。

并且我需要遵守以下限制:

  • A 是主键。
  • 对于一个B,只能有一个C,即:1-1; 2-1 ; 3-2 但不是 1-2。
  • B-C和D可以取任意值但不能重复,即:1-1 1 ; 1-1 2 ;不再是 1-1 1。
  • E 可以取任何值。

所以,考虑下面的顺序

| A | B | C | D | E |

| 1 | 1 | 1 | 1 | 1 | -> OK 

| 2 | 1 | 2 | 1 | 1 | -> Should fail, because there is a B with another C, 1-2 must be 1-1.

| 3 | 1 | 1 | 2 | 1 | -> OK

| 4 | 1 | 1 | 2 | 1 | -> Should fail, because relation between B-C and D is repeated.

| 5 | 2 | 1 | 1 | 1 | -> OK

有没有办法通过数据库中的某些约束来遵守这种行为?

谢谢!

最佳答案

A和E与问题无关,可以忽略。

通过在 BCD 上创建唯一索引可以轻松解决 BCD 规则。

如果对于每个 B 只能有一个 C,则您的数据库未规范化。用 B 和 C 创建一个新表。将 B 设为主键或在 B 上创建唯一索引。然后从原始表中删除 C。 (此时 BCD 上的唯一索引成为 BD 上的唯一索引。)

如果不对表进行规范化,我认为没有任何方法可以通过约束来做到这一点。您当然可以使用触发器或代码来完成。

关于sql - 如何给数据库约束以确保表中的这种行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40750288/

相关文章:

mysql - 将 Sql Server 查询转换为 MySql Server 查询

sql-server - 我的任务是维护 ITEMS 库存

PHP - 如何将代码作为文本回显

sql - 将表中的多行分组到列中

oracle - 外键是否总是引用另一个表中的唯一键?

sql - 在 SQL Server 中将 NULL 转换为空字符串

mysql - 将表连接在一起Mysql 3次

sql - Oracle 在没有子查询的情况下获取不同组的总和

MySQL - 如何用另一个表的值更新一个表?

database - 天蝎座隐藏显示情绪