Como usar UPDATE, DELETE e INSERT instruções SQL

Além de SELECIONAR declarações, ATUALIZAR, EXCLUIR, e INSERIR instruções SQL também pode incluir ONDE cláusulas. Essa ONDE cláusulas pode conter subconsultas da mesma maneira que SELECIONAR declarações 'ONDE cláusulas fazer.

Por exemplo, Zetec acaba de fazer um acordo de compra de volume com vendas Olímpicos e quer fornecer Olímpico com um crédito retroativo de 10 por cento para todas as suas compras no último mês. Você pode dar este crédito com uma ATUALIZAR declaração:

ATUALIZAÇÃO TRANSMASTERSET NetAmount = NetAmount * 0.9WHERE SaleDate> (CurrentDate - 30) DIA E CustID = (SELECT CustIDFROM CUSTOMERWHERE Empresa = 'Vendas Olímpico') -

Você também pode ter uma subconsulta correlacionada em uma ATUALIZAR declaração. Suponha que a tabela de cliente tem uma coluna LastMonthsMax, e Zetec quer dar esse crédito para compras que excedam LastMonthsMax para o cliente:

ATUALIZAÇÃO TRANSMASTER TMSET NetAmount = NetAmount * 0.9WHERE NetAmount> (SELECT CLIENTE LastMonthsMaxFROM CWHERE C.CustID = TM.CustID) -

Note que esta subconsulta está correlacionada: A ONDE cláusula nos últimos referências de linha tanto o CustID da linha do cliente da subconsulta ea CustID da linha TRANSMASTER atual que é um candidato para a atualização.

Uma subconsulta em um ATUALIZAR declaração também pode fazer referência a tabela que está sendo atualizado. Suponha que Zetec quer dar um crédito de 10 por cento para os clientes cujas compras superaram US $ 10.000:

ATUALIZAÇÃO TRANSMASTER TM1SET NetAmount = NetAmount * 0.9WHERE 10000 lt; (SELECT SUM (NetAmount) FROM TRANSMASTER TM2WHERE TM1.CustID = TM2.CustID) -

A subconsulta interna calcula a SOMA do Valor líquido coluna para todas as linhas Transmaster para o mesmo cliente. O que isto significa? Suponha que o cliente com CustID = 37 tem quatro linhas em TRANSMASTER com valores para Valor líquido: 3000, 5000, 2000, e 1000. o SOMA do Valor líquido por esta CustID é 11000.

A ordem na qual o ATUALIZAR declaração processa as filas é definido pela sua implementação e, geralmente, não é previsível. A ordem pode ser diferente, dependendo de como as linhas estão dispostas no disco. Suponha que a aplicação processa as linhas para este CustID nesta ordem: primeiro o TRANSMASTER com um Valor líquido do 3000, em seguida, a um com Valor líquido= 5000, e assim por diante.

Após as três primeiras linhas para CustID 37 foram atualizados, a sua Valor líquido Os valores são 2700 (90 por cento de US $ 3.000), 4500 (90 por cento de $ 5.000), e 1800 (90 por cento de US $ 2.000). Então, quando você processar a última linha TRANSMASTER para CustID 37 (cuja Valor líquido é 1000), a SOMA retornado pela subconsulta seria parecer ser 10000, eo velho Valor líquido valor da última linha para CustID 37.

Assim, parece que a última linha para CustID 37 não é actualizado, porque a comparação com o SOMA não é verdade - afinal, 10000 é não inferior a 10000. Mas essa não é a forma como o ATUALIZAR declaração é definida quando uma subconsulta faz referência a tabela que está sendo atualizado.

Todos avaliações de subconsultas em uma ATUALIZAR declaração referência os valores antigos da mesa- as que estão a ser actualizados. No precedente ATUALIZAR para CustID 37, a subconsulta não retorna 11000 - o original SOMA.

A subconsulta em um ONDE cláusula opera o mesmo como um SELECIONAR declaração ou um ATUALIZAR declaração. O mesmo é verdadeiro para EXCLUIR e INSERIR. Para apagar todas as transações do Olímpicos, use a seguinte declaração:

DELETE FROM TRANSMASTERWHERE CustID = (SELECT CustIDFROM CUSTOMERWHERE Empresa = 'Vendas Olímpico') -

Como com ATUALIZAR, EXCLUIR subqueries também podem ser correlacionados e também pode fazer referência a tabela que está sendo excluído. As regras são semelhantes às regras para ATUALIZAR subconsultas. Suponha que você deseja excluir todas as linhas da TRANSMASTER para clientes cujo total de Valor líquido é maior do que US $ 10.000:

DELETE FROM TRANSMASTER TM1WHERE 10000 lt; (SELECT SUM (NetAmount) FROM TRANSMASTER TM2WHERE TM1.CustID = TM2.CustID) -

Esta consulta exclui todas as linhas de TRANSMASTER que têm CustID 37, bem como quaisquer outros clientes com compras superiores a US $ 10.000. Todas as referências a TRANSMASTER na subconsulta denotar o conteúdo de TRANSMASTER antes de quaisquer exclusões por a instrução atual. Assim, mesmo quando você está excluindo a última linha TRANSMASTER para CustID 37, a subconsulta é avaliada em cima da mesa TRANSMASTER original e retornos 11000.

Quando você atualizar, excluir ou inserir registros de banco de dados, o risco de tornar os dados de uma tabela inconsistentes com outras tabelas no banco de dados. Tal incompatibilidade é chamado um modificação anomaly. Se você excluir registros Transmaster e uma mesa TRANSDETAIL depende TRANSMASTER, você deve excluir os registros correspondentes de TRANSDETAIL também.

Esta operação é chamada eliminação em cascata, porque a exclusão de um registro pai deve cascata para os seus registros filho associados. Caso contrário, os registros filho não excluídos se tornam órfãos. Neste caso, eles seriam linhas de detalhe factura que estão no limbo, porque eles não são mais ligado a um registro da fatura.

Se sua implementação do SQL não suporta exclusões em cascata, você deve fazer as exclusões de si mesmo. Neste caso, excluir os registros apropriados da tabela filho antes de excluir o registro correspondente do pai. Dessa forma, você não tem registros órfãos na tabela filho, nem por um segundo.

menu