Eu quero usar chaves estrangeiras para manter a integridade e evitar órfãos (eu já uso o innoDB).
Como eu faço uma declaração SQL que DELETE ON CASCADE?
Se eu excluir uma categoria, como garantir que ela não exclua produtos que também estejam relacionados a outras categorias.
A tabela dinâmica "categories_products" cria um relacionamento muitos para muitos entre as duas outras tabelas.
categories
- id (INT)
- name (VARCHAR 255)
products
- id
- name
- price
categories_products
- categories_id
- products_id
mysql
foreign-keys
innodb
Cudos
fonte
fonte
Respostas:
Se sua cascata excluir um produto nuke porque ele era um membro de uma categoria que foi eliminada, você configurou suas chaves estrangeiras incorretamente. Dadas as tabelas de exemplo, você deve ter a seguinte configuração de tabela:
Dessa forma, você pode excluir um produto OU uma categoria e apenas os registros associados em categories_products morrerão ao lado. A cascata não viajará mais longe na árvore e excluirá a tabela de produto / categoria pai.
por exemplo
Se você excluir a categoria 'vermelho', apenas a entrada 'vermelho' na tabela de categorias morre, bem como as duas entradas prod / cats: 'botas vermelhas' e 'casacos vermelhos'.
A exclusão não fará mais cascatas e não eliminará as categorias 'botas' e 'casacos'.
comentário comentário:
você ainda está entendendo mal como as exclusões em cascata funcionam. Eles afetam apenas as tabelas nas quais a cascata "ao excluir" é definida. Nesse caso, a cascata é definida na tabela "categories_products". Se você excluir a categoria 'vermelha', os únicos registros que serão excluídos em cascata em categories_products são aqueles em que
category_id = red
. Ele não toca em nenhum registro em que 'category_id = blue' e não avança para a tabela "produtos", porque não há chave estrangeira definida nessa tabela.Aqui está um exemplo mais concreto:
Digamos que você exclua a categoria # 2 (azul):
o DBMS examinará todas as tabelas que possuem uma chave estrangeira apontando para a tabela 'categorias' e excluirá os registros onde o ID correspondente for 2. Como definimos apenas o relacionamento da chave estrangeira
products_categories
, você acaba com essa tabela quando o A exclusão é concluída:Não há chave estrangeira definida na
products
tabela; portanto, a cascata não funcionará lá; portanto, você ainda tem botas e luvas listadas. Não há mais 'botas azuis' e nem 'luvas azuis'.fonte
CASCADE
operar. Caso contrário, o padrão do MySQL, MyISAM, será usado e o MyISAM não suportaCASCADE
operações. Para fazer isso, basta adicionarENGINE InnoDB
antes do último;
.Fiquei confuso com a resposta a esta pergunta, então criei um caso de teste no MySQL, espero que ajude
fonte
Eu acho (não tenho certeza) que restrições de chave estrangeira não farão exatamente o que você deseja, dado o design da sua tabela. Talvez a melhor coisa a fazer é definir um procedimento armazenado que excluirá uma categoria da maneira que você deseja e, em seguida, chame esse procedimento sempre que desejar excluir uma categoria.
Você também precisa adicionar as seguintes restrições de chave estrangeira à tabela de vinculação:
A cláusula CONSTRAINT também pode, é claro, aparecer na instrução CREATE TABLE.
Depois de criar esses objetos de esquema, é possível excluir uma categoria e obter o comportamento desejado, emitindo
CALL DeleteCategory(category_ID)
(onde category_ID é a categoria a ser excluída) e ele se comportará como você deseja. Mas não faça umaDELETE FROM
consulta normal , a menos que você queira um comportamento mais padrão (por exemplo, exclua apenas da tabela de vinculação e deixe aproducts
tabela em paz).fonte
KEY pkey (product_id),
terceiraCREATE TABLE
consulta na resposta aceita?