AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 39703
Accepted
adopilot
adopilot
Asked: 2013-04-11 13:52:51 +0800 CST2013-04-11 13:52:51 +0800 CST 2013-04-11 13:52:51 +0800 CST

Como lidar com situações de atualização ou inserção

  • 772

De vez em quando, meus procedimentos armazenados parecem

create procedure handle_data 
    @fk int,
    @value varchar(10)
as
begin
    if exists (select * from my_table where id = @fk)
    begin
        update my_table
        set value = @value
        where id = @fk
    end 
    else 
    begin
        insert into my_table (fk, value)
            select @fk, @value
    end 
end 

Provavelmente há falha no design do aplicativo que chama esse procedimento armazenado.
Devo evitar fazer aplicativos que executam o mesmo procedimento armazenado e métodos para inserir novos dados e também atualizar os antigos?

Existe uma maneira melhor de atualizar ou inserir dados em uma abordagem?

Estou usando o SQL Server 2005/2008.

sql-server-2008 database-design
  • 3 3 respostas
  • 238 Views

3 respostas

  • Voted
  1. Best Answer
    Aaron Bertrand
    2013-04-11T14:24:57+08:002013-04-11T14:24:57+08:00

    Uma maneira um pouco mais eficiente (que fará, na pior das hipóteses, uma busca/varredura em vez de duas contra os dados existentes):

    UPDATE dbo.whatever SET ... WHERE key = @key;
    IF @@ROWCOUNT = 0
    BEGIN
      INSERT dbo.whatever ...
    END
    

    MERGEpode ser tentador, no entanto, há algumas razões pelas quais eu evito isso.

    1. a sintaxe é assustadora e difícil de memorizar
    2. você não obtém mais simultaneidade do que a abordagem acima, a menos que adicione intencionalmente dicas de bloqueio específicas
    3. existem muitos bugs não resolvidosMERGE e provavelmente muitos mais que ainda não foram descobertos
    • 5
  2. Travis
    2013-04-11T14:03:34+08:002013-04-11T14:03:34+08:00

    A instrução MERGE permitirá que você execute um comando,

    Create procedure handle_data 
      @fk int 
      , @value varchar(10)
    AS
    BEGIN
    
    MERGE my_table AS target
    USING (SELECT @fk, @value) AS source (fk, value)
    ON (target.id = source.fk)
    WHEN MATCHED THEN
        UPDATE SET value = source.Value
    WHEN NOT MATCHED THEN
        INSERT (id, value)
        VALUES (source.fk, source.value);
    
    END
    

    Mais informações sobre mesclagem podem ser encontradas neste artigo no MSDN

    • 4
  3. Mike Fal
    2013-04-11T13:56:20+08:002013-04-11T13:56:20+08:00

    A MERGEinstrução foi introduzida no SQL Server 2008 para lidar exatamente com essa situação.

    • 1

relate perguntas

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Quais são algumas maneiras de implementar um relacionamento muitos-para-muitos em um data warehouse?

  • Quanto "Padding" coloco em meus índices?

  • Existe um processo do tipo "práticas recomendadas" para os desenvolvedores seguirem para alterações no banco de dados?

  • Downgrade do SQL Server 2008 para 2005

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Conceder acesso a todas as tabelas para um usuário

    • 5 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve