Como utilizar atualizar, excluir e inserir instruções sql

Além de SELECIONAR

afirmações, ATUALIZAR, EXCLUIR, e INSERIR instruções SQL também pode incluir ONDE cláusulas. Essa ONDE cláusulas podem conter subconsultas, da mesma forma que SELECIONAR afirmações`ONDE cláusulas de fazer.

Video: Tutorial PHP + MySQL - INSERT, DELETE, UPDATE, SELECT

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 esse crédito com uma ATUALIZAR declaração:

ACTUALIZAÇÃO TRANSMASTERSET NetAmount = NetAmount * 0.9WHERE SaleDate gt; (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. Suponhamos que a tabela de cliente tem uma coluna LastMonthsMax, e Zetec quer dar tal crédito para compras que excedam LastMonthsMax para o cliente:

ACTUALIZAÇÃO TRANSMASTER TMSET NetAmount = NetAmount * 0.9WHERE NetAmountgt; (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 CLIENTE da subconsulta ea CustID da linha TRANSMASTER atual que é um candidato para a atualização.

Uma subconsulta numa 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 interior calcula o 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.

Video: PD - Criar Stored Procedure de Inserir, Alterar e Excluir em uma Única no SQL Server 2012

A ordem na qual o ATUALIZAR declaração processa as linhas é definida por sua implementação e, geralmente, não é previsível. A ordem pode ser diferente, dependendo de como as linhas são organizados 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, o seu Valor líquido valores são 2700 (90 por cento de US $ 3.000), 4500 (90 por cento de US $ 5.000), e 1800 (90 por cento de US $ 2.000). Então, quando você processar a última linha TRANSMASTER para CustID 37 (de quem Valor líquido é 1000), a SOMA retornado pela subconsulta seria parecer ser estar 10000, eo velho Valor líquido valor da última linha para CustID 37.

Video: Usando o Squirrel para criar uma DataBase em uma Tabela e inserir, deletar, atualizar e ler dados

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

Todos avaliações de subconsultas em uma ATUALIZAR declaração referência os valores antigos da mesa- os 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 que 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 subconsultas também pode ser correlacionada e também pode referenciar a tabela a ser suprimido. As regras são semelhantes às regras para ATUALIZAR subconsultas. Suponha que você deseja excluir todas as linhas da TRANSMASTER para os clientes cujo total 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 pela 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 inconsistência é chamada de 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 de 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 de faturas que estão no limbo, porque eles já não estão ligados 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.


Publicações relacionadas