Pergunta

Eu estou tentando criar uma relação em que qualquer uma das quatro partes diferentes podem ser incluídos, mas qualquer coleção das mesmas partes devem ser tratadas como único.

Exemplo: Uma atribuição deve ter uma empresa designada, pode, opcionalmente, ter um local designado, grupo de trabalho e programa. Uma atribuição não pode ter um grupo de trabalho sem um local.

Vamos supor que temos empresas A, B, C; localizações X, Y, Z; grupos de trabalho I, J, K e programas 1, 2, 3.

Assim relações válidas poderia incluir A - X - I - 1 A - Z - 2 DE C C - 3 B - Z - K

Mas as relações inválidos incluiriam A - K (Workgroup sem localização) Y - K - 1 (Nenhuma empresa)

Assim, para criar minha mesa, eu criei

companyID INT NOT NULL,
FOREIGN KEY companyKEY (companyID) REFERENCES company (companyID),
locationID INT,
FOREIGN KEY locationKEY (locationID) REFERENCES location (locationID),
workgroupID INT,
FOREIGN KEY workgroupKEY (workgroupID) REFERENCES workgroup (workgroupID),
programID INT,
FOREIGN KEY programKEY (programID) REFERENCES program (programID),
UNIQUE KEY companyLocationWorkgroupProgramKEY (companyID, locationID, workgroupID, programID)

Eu acho que isso iria lidar com todas as minhas relações, além do neccessity de uma atribuição ter um local se houver um grupo de trabalho (o que eu posso fazer feliz programaticamente ou com gatilhos, eu acho)

No entanto, quando eu testar esse esquema, que me permite digitar o seguinte ...

INSERT INTO test VALUES (1, null, null, null), (1, null, null, null);

... sem reclamar. Eu estou supondo que (1, null, null, null) não é igual em si, porque nulos são incluídos. Se este for o caso, existe alguma maneira eu posso lidar com essa relação?

Qualquer ajuda seria apreciada!

Foi útil?

Solução

Esta é uma característica (embora não o que eu esperava, qualquer um).

Esta discussão sugere fazer a sua chave de uma chave primária para obter o comportamento esperado:

Este é um recurso - um valor NULL é uma valor indefinido, por conseguinte, dois NULL valores não são o mesmo. Pode ser um pouco confuso, mas faz sentido quando você pensa sobre isso.

índice de um único faz garantir que valores não nulos são únicos; você poderia especificar que sua coluna não aceita valores nulos.

Outras dicas

A única maneira que eu posso pensar de lidar com isso sem gatilhos adicionais / programação seria ter um único "nenhuma do acima" valor em cada uma das tabelas referenciadas, de modo que o teste seria parecido

INSERT INTO test VALUES (1, NO_LOCATION, NO_WORKGROUP, NO_PROGRAM),
                        (1, NO_LOCATION, NO_WORKGROUP, NO_PROGRAM)

Onde os identificadores NO_* são o direito tipo / comprimento para as suas colunas de identificação. Este seria, então falhar, como seria de esperar-lo.

No MySQL NULL! = NULL, ou qualquer coisa. Então é isso que a única não funciona. Você deve usar outro valor padrão para espaços em branco, como de zero

Eu acho que é importante notar que há uma maneira adequada para valores nulos devem ser interpretadas e tratadas, e o comportamento exibido pelo OP é exatamente o que está destinado. Você pode ignorar que o comportamento, e você pode lidar com sua consulta da forma que desejar, sem objeção de mim, mas pode ser bem em "Aceitar" uma resposta que descreve alguma forma de Melhores Práticas, ao invés de uma preferência pessoal não-padrão.

Ou se você não concordar com o consenso Best Practice, você simplesmente não pode aceitar qualquer resposta.

Não é uma corrida para obter uma resposta aceita tão rapidamente quanto possível. Deliberação e colaboração também se destinam a ser parte do processo, eu acho.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top