Existem 2 tabelas: 'usuários' e 'endereço'.
create table address (
username varchar(255) not null,
address1 varchar(255),
primary key (username)
)
e
create table users (
user_id varchar(255) not null,
username varchar(255) not null,
address varchar(255) not null,
primary key (user_id)
)
'usuários' tem poucas colunas, incluindo uma coluna chamada 'endereço' e esta tabela 'usuários' é alterada com
1. alter table if exists users add constraint uk_users_username unique (username)
2. alter TABLE users ADD CONSTRAINT fk_user_address FOREIGN KEY(address) REFERENCES address(username) ON DELETE RESTRICT ON UPDATE CASCADE
(apenas tentando criar uma relação unidirecional de 'usuários' para 'endereço' OneToOne )
Agora, como esperado, quando adiciono um registro válido em "usuários", ele adiciona automaticamente uma entrada em "endereço". E também, quando uso um dos comandos DELETE sql abaixo:
1. delete from users where user_id = 'some_user_id';
2. delete from users where username = 'some_user_name';
ele exclui o registro da tabela 'usuários', como esperado; mas o registro relacionado de 'endereço' não é excluído.
Pergunta: Não deveria ser reclamado que a tabela 'users' tem uma restrição em 'address' e que esse "user" não pode ser excluído até que o registro relacionado em 'address' também seja excluído (porque temos ...ON DELETE RESTRICT ON UPDATE CASCADE )?
Desde já, obrigado!!
ON DELETE RESTRICT
impede a exclusão de registros da tabela pai se algum filho estiver apontando para ela. No seu caso, no entanto, você está definindo a FK nausers
tabela e referenciandoaddress
, criandousers
o filho eaddress
o pai. Portanto, você pode excluir deusers
apesar da restrição. Se quiser que a restrição funcione como você está descrevendo, você terá que invertê-las e colocar sua FK naaddress
tabela.Ao definir uma chave estrangeira, a tabela proprietária se torna a "filha" no relacionamento, e a tabela referenciada se torna a mãe.
ON DELETE RESTRICT
protege a mãe, não a filha.Além disso, de modo geral, não é aconselhável adicionar restrições de FK em colunas que contêm dados relevantes para o negócio. Seus nomes de usuário podem ser únicos hoje, mas, em algum momento, alguém pode desejar que eles não sejam mais únicos. Ao adicionar a restrição de FK, você tornaria isso impossível. Em vez disso, uma ideia melhor é adicionar a FK ao ID do registro, e você deve sempre ter identificadores exclusivos não relacionados ao negócio (como um ID gerado).