Usando o MSSQL2005, posso truncar uma tabela com uma restrição de chave estrangeira se primeiro truncar a tabela filho (a tabela com a chave primária do relacionamento FK)?
Eu sei que eu posso
- Use uma
DELETE
cláusula sem um onde e depoisRESEED
a identidade (ou) - Remova o FK, trunque a tabela e recrie o FK.
Eu pensei que, desde que eu truncasse a tabela filho antes do pai, eu ficaria bem sem fazer nenhuma das opções acima, mas estou recebendo este erro:
Não é possível truncar a tabela 'TableName' porque está sendo referenciada por uma restrição FOREIGN KEY.
fonte
Observe que isso provavelmente não é o que você deseja se tiver milhões + de registros, pois é muito lento.
fonte
Por
TRUNCATE TABLE
ser um comando DDL , ele não pode verificar se os registros na tabela estão sendo referenciados por um registro na tabela filho.É por isso que
DELETE
funciona eTRUNCATE TABLE
não funciona : porque o banco de dados pode garantir que não está sendo referenciado por outro registro.fonte
Sem
ALTER TABLE
Como procedimento armazenado
https://github.com/reduardo7/TableTruncate
Observe que provavelmente não é o que você deseja se tiver milhões de registros, pois é muito lento.
fonte
A solução @denver_citizen fornecida acima não funcionou para mim, mas eu gostei do espírito, então modifiquei algumas coisas:
Para o benefício do público, aqui está o script atualizado:
fonte
use o seguinte comando após a exclusão de todas as linhas nessa tabela usando a instrução delete
Edição: sintaxe corrigida para o SQL Server
fonte
TRUNCATE
evita o log e é consideravelmente mais rápido do queDELETE
para tabelas grandes. Como tal, esta não é uma solução equivalente verdadeira.Bem, como não encontrei exemplos da solução muito simples que usei, que é:
Aqui vai:
1) Encontre o nome da chave estrangeira que está causando a falha (por exemplo: FK_PROBLEM_REASON, com campo
ID
, da tabelaTABLE_OWNING_CONSTRAINT
) 2) Remova essa chave da tabela:3) Truncar tabela desejada
4) Volte a adicionar a chave à primeira tabela:
É isso aí.
fonte
Aqui está um script que escrevi para automatizar o processo. Espero que ajude.
fonte
sys.foreign_keys
tabela. ( Referência )Você pode seguir esta etapa. Ao
reseeding table
excluir os dados da tabela.se ocorrer algum erro, será necessário reenviar a tabela principal.
fonte
fonte
Se bem entendi, o que você deseja fazer é ter um ambiente limpo a ser configurado para o banco de dados envolvendo testes de integração.
Minha abordagem aqui seria descartar todo o esquema e recriá-lo mais tarde.
Razões:
fonte
Encontrado em outro lugar na web
fonte
Você não pode truncar uma tabela se não eliminar as restrições. Uma desativação também não funciona. você precisa largar tudo. Eu criei um script que descarta todas as restrições e depois recria.
Certifique-se de envolvê-lo em uma transação;)
fonte
As respostas de @denver_citizen e @Peter Szanto não funcionaram para mim, mas eu as modifiquei para dar conta:
fonte
truncado não funcionou para mim, excluir + reeditar é a melhor saída. Caso haja alguns de vocês por aí que precisam iterar um grande número de tabelas para executar exclusão + propagação, você pode ter problemas com algumas tabelas que não possuem uma coluna de identidade, o código a seguir verifica se existe uma coluna de identidade antes de tentar reenviar
fonte
Escrevi as seguintes maneiras e tentei parametrizá-las, para que você possa executá-las em um
Query document
Ou Tornar um útilSP
com elas facilmente .A) Excluir
Se sua tabela não possui milhões de registros, isso funciona bem e não possui nenhum comando Alter :
B) Truncar
Se sua tabela possui milhões de registros ou você não tem nenhum problema com o comando Alter nos seus códigos, use este:
fonte
É a minha solução para esse problema. Eu usei para alterar PK, mas a mesma idéia. Espero que isso seja útil)
fonte
Para
MS SQL
, pelo menos as versões mais recentes, você pode simplesmente desativar as restrições com código como este:fonte
O seguinte funciona para mim, mesmo com restrições de FK, e combina as seguintes respostas para eliminar apenas as tabelas especificadas :
Nota:
Eu acho que ainda ajuda a declarar as tabelas na ordem em que você deseja que elas sejam excluídas (ou seja, elimine as dependências primeiro). Como visto nesta resposta , em vez de nomes específicos de loop, você pode substituir todas as tabelas por
fonte
DELETE
não é o mesmo queTRUNCATE
. Isso irá preencher seus logs de transações.Se nenhuma dessas respostas funcionou como no meu caso, faça o seguinte:
Boa sorte!
fonte
Exclua e redefina o incremento automático:
então
fonte
A única maneira é descartar chaves estrangeiras antes de fazer o truncado. E depois de truncar os dados, você deve recriar os índices.
O script a seguir gera o SQL necessário para eliminar todas as restrições de chave estrangeira.
Em seguida, o script a seguir gera o SQL necessário para recriar chaves estrangeiras.
Execute o script gerado para descartar todas as chaves estrangeiras, truncar tabelas e, em seguida, execute o script gerado para recriar todas as chaves estrangeiras.
As consultas são retiradas daqui .
fonte
No SSMS, eu tinha o diagrama aberto mostrando a chave. Depois de excluir a chave e truncar o arquivo, atualizei o foco e voltei ao diagrama e criei uma atualização limpando e restaurando uma caixa de identidade. Salvar o diagrama exibiu uma caixa de diálogo Salvar, em vez da caixa de diálogo "Alterações foram feitas no banco de dados enquanto você estava trabalhando", clicar em Sim restaurou a chave, restaurando-a da cópia trancada no diagrama.
fonte
Se você estiver fazendo isso com algum tipo de frequência, mesmo com um cronograma, eu absolutamente, inequivocamente, nunca usaria uma declaração DML. O custo de gravação no log de transações é muito alto e
SIMPLE
é ridículo definir o banco de dados inteiro no modo de recuperação para truncar uma tabela.Infelizmente, o melhor caminho é o caminho difícil ou trabalhoso. Sendo esse:
Meu processo para fazer isso envolve as seguintes etapas:
Scripts dessa natureza devem ser feitos dentro de um bloco
begin tran
ecommit tran
.fonte
Acabei de descobrir que você pode usar a tabela TRUNCATE em uma tabela pai com restrições de chave estrangeira em um filho, desde que você desabilite primeiro as restrições na tabela filho . Por exemplo
Chave estrangeira CONSTRAINT child_par_ref na tabela filho, referências PARENT_TABLE
fonte
A maneira mais fácil:
1 - Digite phpmyadmin
2 - Clique no nome da tabela na coluna esquerda
3 - Clique em Operação (menu superior)
4 - Clique em "Esvaziar a tabela (TRUNCATE)
5 - Desativar caixa" Ativar verificação de chave estrangeira "
6 - Concluído !
Link para o tutorial da imagem
Tutorial: http://www.imageno.com/wz6gv1wuqajrpic.html
(desculpe, não tenho reputação suficiente para fazer upload de imagens aqui: P)
fonte
Você poderia tentar
DELETE FROM <your table >;
.O servidor mostrará o nome da restrição e a tabela. Ao excluir essa tabela, você pode excluir o que precisa.
fonte
reference - tabela de restrições de chave estrangeira truncada
Trabalhando para mim no MYSQL
fonte