Estou tentando criar um índice exclusivo de código de barras e data. É possível ter make barcode unique unless date is different than inserted row's (date) being inserted
? Criei um índice exclusivo no código de barras, mas às vezes as etiquetas são reimpressas acidentalmente ou as sequências são redefinidas depois que o tempo passa e ocorre o limite de três dígitos de 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
Como faço para que isso aconteça no Maria DB?
O que você descreveu precisa de um índice "composto":
Em SQL uma tupla é composta por vários itens escritos (a,b,c...). Por exemplo (sobrenome,nome) ou (data,código de barras).
Considere duas tuplas (data1,código de barras1) e (data2,código de barras2).
(data1,código de barras1) = (data2,código de barras2) se e somente se todos os itens da tupla1 forem iguais aos itens correspondentes da tupla2. Neste caso, data1=data2 e código de barras1=código de barras2.
Portanto, se você criar uma restrição UNIQUE em (data, código de barras), toda a tupla será única: pode haver apenas uma linha com valores específicos de (data, código de barras). Acho que isso corresponde ao que você deseja.
Observe que NULL significa desconhecido e NULL não é igual a NULL, portanto, mesmo se você definir uma restrição UNIQUE em (a,b), poderá ter tantas linhas com (a,NULL) e o mesmo valor de a.
Agora você também poderia usar UNIQUE(barcode,date) e isso faria exatamente a mesma coisa, então você tem que escolher qual.
UNIQUE é implementado como um tipo especial de índice, neste caso um índice de 2 colunas, nas mesmas colunas e na mesma ordem. Como um índice em (a,b,c...) também pode ser usado como um índice em (a) e (a,b), você pode escolher a ordem das colunas em sua restrição exclusiva para aproveitar ao máximo o "livre "índice. Então, se você já tinha um índice em (data) e criou um UNIQUE(data, código de barras), você pode eliminar o primeiro índice, pois o índice UNIQUE já cobre essa coluna, isso economizará alguns recursos.
Pessoalmente eu usaria UNIQUE(barcode,date) pois isso otimiza:
... então, se você tiver um índice no código de barras, poderá eliminá-lo. TAmbém é necessário um índice na data.
O outro caso, (data, código de barras) seria menos útil porque você provavelmente não usará BETWEEN ou ORDER BY no código de barras.