我正在尝试创建条形码和日期的唯一索引。有可能有吗make barcode unique unless date is different than inserted row's (date) being inserted
?我在条形码上创建了一个唯一的索引,但有时标签会因意外而重新打印,或者一段时间后序列会重置,并且出现 999 的三位数限制。
[barcode] [date] what i want to happen
=========================================================
1234567999 2022-12-01 be entered into database
1234567001 2022-12-02 be entered into database
1234567999 2023-12-01 be entered into database
1234567001 2023-12-02 be entered into database
1234567999 2023-12-01 fail as duplicate
我该如何在 Maria DB 中实现这一点?
您所描述的需要一个“复合”索引:
在 SQL 中,元组由多个写入的项目组成(a、b、c...)。例如(姓氏,名字)或(日期,条形码)。
考虑两个元组 (date1,barcode1) 和 (date2,barcode2)。
(date1,barcode1) = (date2,barcode2) 当且仅当 tuple1 的所有项目都等于 tuple2 的相应项目。在这种情况下,日期1=日期2并且条形码1=条形码2。
因此,如果您对 (date,barcode) 创建 UNIQUE 约束,则整个元组都是唯一的:只能有一行具有 (date,barcode) 的特定值。我想这符合你想要的。
请注意,NULL 表示未知,并且 NULL 不等于 NULL,因此即使对 (a,b) 设置 UNIQUE 约束,也可以有尽可能多的具有 (a,NULL) 且 a 值相同的行。
现在您还可以使用 UNIQUE(barcode,date) ,这会做完全相同的事情,所以您必须选择哪一个。
UNIQUE 是作为一种特殊类型的索引实现的,在本例中是 2 列索引,在相同的列上且按相同的顺序。由于 (a,b,c...) 上的索引也可以用作 (a) 和 (a,b) 上的索引,因此您可以在唯一约束中选择列顺序,以充分利用“自由” “ 指数。因此,如果您已经在(日期)上有一个索引并创建了一个 UNIQUE(日期,条形码),您可以删除第一个索引,因为 UNIQUE 索引已经覆盖了该列,它将节省一些资源。
就我个人而言,我会使用 UNIQUE(barcode,date) 因为这样可以优化:
...然后,如果您有条形码索引,则可以将其删除。还需要日期索引。
另一种情况(日期,条形码)不太有用,因为您可能不会在条形码上使用 BETWEEN 或 ORDER BY。