O artigo atual se concentra no uso ligeiramente avançado da instrução DELETE para remover um ou mais registros (linhas) de uma tabela. Embora seja direcionado principalmente para iniciantes, suas dicas podem ser úteis para todos os especialistas em banco de dados.
Pré-requisitos:a instrução DELETE Cenários básicos
Se você ainda não estiver familiarizado com os usos básicos da instrução Delete, recomendamos que você revise o artigo anterior SQL Server DELETE – Removendo uma ou mais linhas de uma tabela. Esse artigo se concentra nos seguintes aspectos:
- Configurando um banco de dados de amostra.
- Executando scripts SQL no banco de dados de amostra.
- Criar uma tabela em um banco de dados de amostra e inserir dados nela.
- Excluindo todas as linhas de uma tabela.
- Exclusão de uma ou mais linhas de uma tabela com base em uma condição.
- Exclusão de uma ou mais linhas de uma tabela com base em várias condições.
Esses dados são cruciais para entender antes de pularmos para o uso ligeiramente avançado da instrução Delete, portanto, revise esse artigo se você não tiver o histórico necessário até agora.
Cenários ligeiramente avançados para a instrução DELETE
Como em qualquer outro passo a passo, devemos primeiro configurar um banco de dados de amostra para testar a execução de nossos scripts com segurança.
Uma dica sobre a configuração do banco de dados de exemplo
Eu recomendo instalar o SQL Server Developer Edition em sua máquina localmente primeiro. É melhor para fins de aprendizado e teste.
Download da edição de desenvolvedor do SQL Server
Configurar um banco de dados de amostra (WatchesDelSample)
Vamos configurar um banco de dados chamado WatchesDelSample. Esse banco de dados contém as três tabelas a seguir:
- Assista.
- Cor.
- WatchType.
A tabela Watch é a principal. Ele contém o nome, a cor e o tipo do relógio. As informações sobre o tipo e a cor vêm das duas tabelas de referência Cor e WatchType conectado por meio de chaves estrangeiras.
Configure o banco de dados de amostra com o seguinte script:
-- Create sample database WatchesDelSample
USE MASTER
GO
CREATE DATABASE WatchesDelSample
GO
USE WatchesDelSample
-- Creating a reference table WatchType
CREATE TABLE dbo.WatchType
(
WatchTypeId INT IDENTITY(1,1),
Name VARCHAR(50)NOT NULL,
Detail VARCHAR(200)NULL
CONSTRAINT PK_WatchType_WatchTypeId PRIMARY KEY (WatchTypeId)
)
GO
-- Populating (adding rows to the) table WatchType
SET IDENTITY_INSERT dbo.WatchType ON
GO
INSERT INTO dbo.WatchType
(
WatchTypeId
,Name
,Detail
)
VALUES
(
1 -- ID - INT Primary Key
,'Analogue' -- Name - varchar(50) NOT NULL
,'This is Analogue' -- Detail - varchar(200)
),
(
2 -- ID - INT Primary Key
,'Digital' -- Name - varchar(50) NOT NULL
,'This is Digital' -- Detail - varchar(200)
),
(
3 -- ID - INT Primary Key
,'Sports' -- Name - varchar(50) NOT NULL
,'This is Sports' -- Detail - varchar(200)
);
GO
SET IDENTITY_INSERT dbo.WatchType OFF
GO
-- Creating a reference table Color
CREATE TABLE dbo.Color
(
ColorId INT IDENTITY(1,1),
Name VARCHAR(50)NOT NULL,
Detail VARCHAR(200)NULL
CONSTRAINT PK_Color_ColorId PRIMARY KEY (ColorId)
)
GO
-- Populating (adding rows to the) table Color
SET IDENTITY_INSERT dbo.Color ON
GO
INSERT INTO dbo.Color
(
ColorId
,Name
,Detail
)
VALUES
(
1 -- ID - INT Primary Key
,'Black' -- Name - varchar(50) NOT NULL
,'This is Black' -- Detail - varchar(200)
),
(
2 -- ID - INT Primary Key
,'White' -- Name - varchar(50) NOT NULL
,'This is White' -- Detail - varchar(200)
),
(
3 -- ID - INT Primary Key
,'Blue' -- Name - varchar(50) NOT NULL
,'This is Blue' -- Detail - varchar(200)
);
GO
SET IDENTITY_INSERT dbo.Color OFF
GO
-- Creating a table Watch
CREATE TABLE dbo.Watch
(
WatchId INT IDENTITY(1,1),
Name VARCHAR(50),
WatchTypeId INT,
ColorId INT,
Price DECIMAL(5,2),
CONSTRAINT PK_Watch_WatchId PRIMARY KEY (WatchId)
)
GO
-- Creating foreign key constraint on Watch table to get WatchTypeId values from WatchType table
ALTER TABLE dbo.Watch
ADD CONSTRAINT [FK_Watch_WatchType_WatchTypeId]
FOREIGN KEY ([WatchTypeId]) REFERENCES dbo.[WatchType] ([WatchTypeId]);
-- Creating foreign key constraint on Watch table to get ColorId values from Color table
ALTER TABLE dbo.Watch
ADD CONSTRAINT [FK_Watch_Color_ColorId]
FOREIGN KEY ([ColorId]) REFERENCES dbo.[Color] ([ColorId]);
-- Populating (adding rows to the) table Watch getting some columns values from reference tables
SET IDENTITY_INSERT WatchesDelSample.dbo.Watch ON
GO
INSERT WatchesDelSample.dbo.Watch(WatchId, Name, WatchTypeId, ColorId, Price) VALUES (1, 'Casio', 1, 1, 100.00)
INSERT WatchesDelSample.dbo.Watch(WatchId, Name, WatchTypeId, ColorId, Price) VALUES (2, 'Timex', 2, 2, 70.00)
GO
SET IDENTITY_INSERT WatchesDelSample.dbo.Watch OFF
GO
Verificação rápida de dados
Vamos ver todas as linhas do Assistir tabela. Para isso, execute o seguinte script:
-- View the watch table data (rows)
SELECT w.WatchId
,w.Name
,w.WatchTypeId
,w.ColorId
,w.Price FROM dbo.Watch w
A saída é a seguinte:
Observe que estou usando o dbForge Studio for SQL Server para esta demonstração. No entanto, você pode usar o SQL Server Management Studio (SSMS) para executar os mesmos scripts – os resultados serão os mesmos.
Compreendendo os IDs (códigos) por trás das colunas Tipo e Cor
Como você pode ver, existem alguns IDs nas seguintes colunas da tabela Watch:
- WatchTypeId
- ColorId
Essas colunas obtêm valores das tabelas de referência onde foram definidas originalmente. A tabela Watch se conecta a essas tabelas de referência por meio de restrições de chave estrangeira.
Três problemas ocorrem com a saída acima:
- Podemos ver o WatchTypeId e o ColorId, mas não entendemos o que são.
- Se entendermos o que esses IDs significam, devemos voltar sempre às tabelas originais para verificar.
- Mais importante, por que precisamos obter Cor e Tipo de outras tabelas?
Há uma razão pela qual definimos Color (ColorId) e Type (WatchTypeId) em outras tabelas. Precisamos garantir que esses valores permaneçam consistentes.
Se não definirmos originalmente o valor nas tabelas de referência, poderíamos ter misturado as palavras para representar a cor ou o tipo. Por exemplo, pode haver tanto Azul e Azuis , ou Analógico e Analógico . Para evitar esse problema, padronizamos cores e tipos em tabelas de referência. Em seguida, passamos seus códigos para a mesa principal.
Ao unir a tabela Watch com outras tabelas de referência, podemos recuperar os valores por trás desses códigos. É uma prática comum no desenvolvimento de banco de dados.
Visualizando a tabela de monitoramento com valores de tipo e cor por trás dos IDs
Podemos visualizar o significado real dos códigos por trás de Color e Type executando o seguinte script:
-- View the watch table data (rows)
SELECT w.WatchId
,w.Name
,wt.Name AS WatchType
,c.Name AS ColorName
,w.Price FROM dbo.Watch w
INNER JOIN dbo.Color c ON c.ColorId=w.ColorId
INNER JOIN dbo.WatchType wt ON w.WatchTypeId = wt.WatchTypeId
O resultado é o seguinte:
Compreendendo a arquitetura do banco de dados
Precisamos de mais informações sobre a arquitetura desse banco de dados. Nosso foco é em como as tabelas se conectam.
A imagem acima demonstra o cenário das tabelas de referência ajudando a tabela principal a receber dados consistentes. Não é um cenário simples principalmente para iniciantes, embora seja comum em muitos bancos de dados.
Estamos estudando essa arquitetura porque precisamos entender como excluir uma ou mais linhas de qualquer uma das tabelas acima quando elas estão vinculadas assim.
Excluindo uma linha da tabela de referência (Cor)
Podemos excluir uma linha da tabela de referência ou não? Vamos descobrir a resposta.
Excluímos a primeira linha da tabela Color:
-- Deleting one row with color id 1 from the reference table color
DELETE FROM Color
WHERE ColorId = 1
O resultado é o seguinte:
O erro significa que não é permitido excluir essa linha que desejávamos.
Em outras palavras, não podemos excluir uma linha de uma tabela que está sendo referenciada por outra tabela.
Linhas vinculadas x linhas desvinculadas
Vamos dividir as linhas de uma tabela de referência nas duas categorias a seguir:
- Linhas vinculadas.
- Linhas desvinculadas.
Uma linha vinculada é uma linha de uma tabela de referência usada por outra tabela. Uma linha desvinculada é uma linha de uma tabela de referência à qual outra tabela não apela.
Podemos excluir linhas (registros) desvinculadas de uma tabela de referência imediatamente.
Nossa tentativa anterior de excluir uma linha da tabela Color falhou porque esse ColorId (1) estava em uso da tabela Watch principal.
Visualizar a Tabela de Referência (Cor)
Vejamos a tabela de referência da seguinte forma:
-- View reference table Color
SELECT c.ColorId
,c.Name
,c.Detail FROM dbo.Color c
O conjunto de resultados está abaixo:
Das saídas anteriores, sabemos que a cor Blue (ColorId:3) não está em uso pela tabela Watch, pois ainda não há relógio azul armazenado na tabela.
Excluindo uma linha desvinculada da tabela de referência (Cor)
Execute o seguinte script:
-- Deleting unlinked row with color id 3 from reference table Color
DELETE FROM Color
WHERE ColorId = 3 -- blue color
Excluímos a linha com sucesso e podemos confirmá-la visualizando a tabela:
--View reference table Color after deleting the unlinked row
SELECT c.ColorId
,c.Name
,c.Detail FROM dbo.Color c
O conjunto de resultados está abaixo:
Mostra que a linha que contém o azul a cor foi removida com sucesso da tabela.
Uma dica sobre a remoção de dados da tabela de referência
Lembre-se de que você não pode excluir um registro (linha) de uma tabela de referência se estiver em uso de outra tabela ou grupo de tabelas. No entanto, você pode excluir um registro da mesma tabela (referência) se não estiver em uso.
Excluindo uma linha vinculada da tabela de referência (Cor)
E se quisermos remover uma linha de uma tabela de referência sabendo que ela passa os dados de referência, como cores, para outra tabela? Em outras palavras, como excluímos uma linha vinculada da tabela de referência?
Primeiro, devemos excluir essa linha da tabela principal onde ela é referenciada.
Por exemplo, podemos excluir a cor Branco da tabela de cores da seguinte forma:
- Exclua todas as linhas da tabela principal (Watch) em que a cor seja branca (com base no id).
- Exclua a linha da tabela de cores de referência em que a cor é branca (com base no id).
Agora, vamos examiná-lo na prática.
Excluindo todas as linhas em que a cor é branca da tabela principal (Observação)
Nosso objetivo é remover os traços do branco cor das tabelas de referência e principal.
Vamos dar uma olhada nos dados antes de excluí-los. Queremos verificar quantas linhas da tabela principal contêm a cor id 2 (branca):
-- View Watch table before deleting rows with white color (color id:2)
SELECT w.WatchId
,w.Name
,w.WatchTypeId
,w.ColorId
,w.Price FROM dbo.Watch w
WHERE w.ColorId=2 -- White Color
O resultado está abaixo:
Agora, exclua as linhas com ID de cor 2 executando o seguinte script T-SQL:
-- Deleting all the rows with color id 2 from main table Watch
DELETE FROM dbo.Watch
WHERE ColorId = 2 -- white color
A saída é a seguinte:
Visualize a tabela principal após remover todas as linhas com a cor branca
Precisamos verificar a tabela principal para quaisquer linhas que contenham o ID de cor 2:
-- View the watch table data (rows)
SELECT w.WatchId
,w.Name
,wt.Name AS WatchType
,w.ColorId
,c.Name AS ColorName
,w.Price FROM dbo.Watch w
INNER JOIN dbo.Color c ON c.ColorId=w.ColorId
INNER JOIN dbo.WatchType wt ON w.WatchTypeId = wt.WatchTypeId
Como vemos, os registros para os relógios de cor branca estão ausentes. Isso prova que excluímos com sucesso todas essas linhas.
Excluindo uma linha vinculada anteriormente da tabela de referência (Cor)
Após removermos as linhas referenciadas da tabela principal, também podemos remover a linha vinculada anteriormente da tabela de referência. O fato é que esse link agora não existe mais.
Execute o script a seguir na tabela Color de referência para excluir a linha com o ID de cor 2 (branco):
-- View reference table before removing color id 1 (white)
SELECT c.ColorId
,c.Name
,c.Detail FROM dbo.Color c
-- Deleting one row with color id 2 from the reference table color
DELETE FROM Color
WHERE ColorId = 2 -- White Color
-- View reference table after removing color id 1 (white)
SELECT c.ColorId
,c.Name
,c.Detail FROM dbo.Color c
A saída é a seguinte:
Parabéns!
Aprendemos como remover uma ou mais linhas de uma tabela de referência. Podemos fazer isso se a linha estiver sendo referenciada e se não estiver. Além disso, examinamos a exclusão de linhas da tabela principal.
Uma dica sobre como excluir todos os dados
Existe outra instrução T-SQL conhecida como Truncate Table – é mais eficiente para remover todos os dados de uma tabela. No entanto, a tabela não deve ser referenciada em outro lugar, porque você precisa excluir os dados da tabela principal primeiro. É o mesmo que demonstramos neste artigo anterior. Em seguida, aplicamos o Truncar declaração contra a tabela de referência como uma etapa final.
O código é o seguinte:
-- Deleting all rows from the main table using Truncate
TRUNCATE TABLE dbo.Watch
No entanto, assim como com a instrução Delete, você deve ter muito cuidado com Truncate , ou você acaba excluindo todos os dados de uma tabela.
Palavra de Conselho
A exclusão de linhas em cenários em tempo real nos ajuda principalmente a remover dados indesejados (como modelos desativados) do banco de dados principal ou a arquivar dados e armazená-los em um banco de dados de arquivo.
Coisas para fazer
Agora que você pode excluir uma ou mais linhas em cenários ligeiramente avançados, como tabelas vinculadas, tente as seguintes coisas para melhorar ainda mais suas habilidades:
- Excluir o tipo de relógio analógico da tabela de referência WatchType com base no ID.
- Excluir todas as linhas da Cor tabela de referência.
- Tente redefinir o banco de dados de amostra e veja com que rapidez você pode excluir todos os dados de todas as tabelas (de referência e principal).