每个外键的MariaDB条件唯一约束

8mmmxcuj  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(182)

我有一个表Stuff,它在表Heighness中有额外的信息。Heighness有一个指向Stuff的外键和一个列level。列level可能在指向Stuff的每个外键中无限次出现相同的值,除了Stuff的每个外键最多只能出现一次值topMost。因此,Stuff的每次出现只能有一个Heighness元素,该元素被计为topMostlevel列必须始终设置为一个值(非空值)。
MariaDB可以对此进行约束吗?如下所示:

Stuff-Table
| ID | ... |
+----+-----+
| 3  | ... |
| 4  | ... |

Heighness-Table
| ID | Stuff_id | level    |
+----+----------+----------+
|  1 |     3    | mediocre | 
|  2 |     3    | mediocre | <-- As it's not "topMost", as many as you want.
|  3 |     3    | topMost  | <-- Perfect, only 0 to 1 occurences.

|  4 |     4    | topMost  | <-- 2nd occurence absolute, but only 1st per foreign key. Nice.
|  5 |     4    | low      |
|  6 |     4    | topMost  | <-- 2 occurences per foreign key! Error! MariaDB should block this!

MariaDB 10.6有唯一索引,但没有过滤的唯一索引、检查和唯一约束,这似乎还不够,我会退回到触发器,这是我想避免的。
我说错了吗?有UNIQUE和CHECK约束的组合可以使用吗?

kh212irz

kh212irz1#

创建一个generated column,它对于topMost是唯一的,而对于mediocre不是唯一的,并在它上面创建一个唯一索引:

ALTER TABLE Heighness
ADD uqLevel varbinary(12) AS ( CONCAT(Stuff_id, '-', LEFT(level, 1), IF(level= topMost, Stuff_id, ID)) )
  PERSISTENT UNIQUE

这将为表生成:

3-m1
3-m2
3-t3

4-t4
4-l5
4-t4 - This is a duplicate.

正常FK约束条件,另外确保Stuff_idSutff表中

相关问题