Eu tenho uma tabela que possui várias colunas de identificação para outras tabelas.
Eu quero uma chave estrangeira para forçar a integridade somente se eu colocar dados lá. Se eu fizer uma atualização posteriormente para preencher essa coluna, também deverá verificar a restrição.
(Isso provavelmente depende do servidor de banco de dados, estou usando o tipo de tabela MySQL e InnoDB)
Acredito que seja uma expectativa razoável, mas corrija-me se estiver errado.
sql
mysql
database
foreign-keys
dobrador
fonte
fonte
Respostas:
Sim, você pode aplicar a restrição apenas quando o valor não for NULL. Isso pode ser facilmente testado com o seguinte exemplo:
A primeira inserção será aprovada porque inserimos um NULL no arquivo
parent_id
. A segunda inserção falha devido à restrição de chave estrangeira, pois tentamos inserir um valor que não existe naparent
tabela.fonte
parent_id INT NULL
parte é (verbalmente) igual aparent_id int default null
int
vez deInteger
nos membros de sua classe, o padrão nunca será nulo, mas será 0 e você falhará na restrição.Descobri que, ao inserir, os valores da coluna nula precisavam ser declarados especificamente como NULL; caso contrário, eu receberia um erro de violação de restrição (em oposição a uma string vazia).
fonte
INSERT INTO {table} {list_of_columns}
? Porque isso é verdade para mim; omitir a menção da coluna causa erro, mas incluir e definir explicitamente como NULL corrige o erro. Se eu estiver correto, eu acho @ comentário de Gary não se aplica (porque você não quis dizer uma empty-string), mas @ Kevin Coulombe de poderia ser útil ...Sim, isso funcionará como você espera. Infelizmente, parece que estou tendo problemas para encontrar uma declaração explícita disso no manual do MySQL .
Chaves estrangeiras significam que o valor deve existir na outra tabela. NULL se refere à ausência de valor, portanto, quando você define uma coluna como NULL, não faria sentido tentar impor restrições a isso.
fonte
O acima funciona, mas isso não. Observe a opção ON DELETE CASCADE
fonte
Sim, o valor pode ser NULL, mas você deve ser explícito. Eu já experimentei essa mesma situação antes, e é fácil esquecer POR QUE isso acontece e, portanto, é preciso um pouco para lembrar o que precisa ser feito.
Se os dados enviados forem convertidos ou interpretados como uma sequência vazia, eles falharão. No entanto, configurando explicitamente o valor como NULL ao INSERIR ou ATUALIZAR, você estará pronto.
Mas isso é divertido de programar, não é? Criando nossos próprios problemas e corrigindo-os! Felicidades!
fonte
Outra maneira de contornar isso seria inserir um elemento DEFAULT na outra tabela. Por exemplo, qualquer referência a uuid = 00000000-0000-0000-0000-000000000000 na outra tabela indicaria nenhuma ação. Você também precisa definir todos os valores para esse ID como "neutro", por exemplo, 0, string vazia, nula para não afetar sua lógica de código.
fonte
Eu também fiquei preso nessa questão. Mas resolvi simplesmente definindo a chave estrangeira como
unsigned integer
. Encontre o exemplo abaixofonte