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 / 74627
Accepted
Smokey
Smokey
Asked: 2014-08-22 22:22:50 +0800 CST2014-08-22 22:22:50 +0800 CST 2014-08-22 22:22:50 +0800 CST

Diferença entre On Delete Cascade e On Update Cascade no mysql

  • 772

Eu tenho duas tabelas no banco de dados MySQL- parent, child. Estou tentando adicionar referências de chave estrangeira à minha tabela filho com base na tabela pai. Existe alguma diferença significativa entre ON UPDATE CASCADEeON DELETE CASCADE

Minha tabela pai

CREATE TABLE parent (
    id INT NOT NULL,
    PRIMARY KEY (id)
) ENGINE=INNODB;

Minha pergunta é: Qual é a diferença entre as seguintes consultas sql.

  1. ON DELETE CASCADE

    CREATE TABLE child (
        id INT, 
        parent_id INT,
        INDEX par_ind (parent_id),
        FOREIGN KEY (parent_id) 
            REFERENCES parent(id)
            ON DELETE CASCADE
    ) ENGINE=INNODB;
    
  2. ON UPDATE CASCADE

    CREATE TABLE child (
        id INT, 
        parent_id INT,
        INDEX par_ind (parent_id),
        FOREIGN KEY (parent_id) 
            REFERENCES parent(id)
            ON UPDATE CASCADE
    ) ENGINE=INNODB;
    
  3. ON UPDATE CASCADE ON DELETE CASCADE

    CREATE TABLE child (
            id INT, 
            parent_id INT,
            INDEX par_ind (parent_id),
            FOREIGN KEY (parent_id) 
                REFERENCES parent(id)
                ON UPDATE CASCADE ON DELETE CASCADE
        ) ENGINE=INNODB;
    

Existem erros nas consultas? O que essas consultas (1,2 e 3) significam? São iguais???

mysql innodb
  • 3 3 respostas
  • 215206 Views

3 respostas

  • Voted
  1. Best Answer
    Vérace
    2014-08-22T23:49:46+08:002014-08-22T23:49:46+08:00

    Um tópico muito bom sobre este assunto pode ser encontrado aqui e também aqui . O guia definitivo para o MySQL é, obviamente, a documentação, que pode ser encontrada aqui .

    No padrão SQL 2003 existem 5 ações referenciais diferentes:

    1. CASCATA
    2. RESTRINGIR
    3. SEM AÇÃO
    4. DEFINIR NULO
    5. CONJUNTO PADRÃO

    Para responder a pergunta:

    1. CASCATA

      • ON DELETE CASCADEsignifica que, se o registro pai for excluído, todos os registros filhos também serão excluídos. Isso não é uma boa ideia na minha opinião. Você deve acompanhar todos os dados que já estiveram em um banco de dados, embora isso possa ser feito usando TRIGGERs. (No entanto, veja advertência nos comentários abaixo).

      • ON UPDATE CASCADEsignifica que se a chave primária pai for alterada, o valor filho também será alterado para refletir isso. Mais uma vez, na minha opinião, não é uma grande ideia. Se você estiver alterando PRIMARY KEYs com alguma regularidade (ou até mesmo!), há algo errado com seu design. Novamente, veja os comentários.

      • ON UPDATE CASCADE ON DELETE CASCADEsignifica que, se você UPDATE OR DELETE o pai, a alteração será em cascata para o filho. Isso é o equivalente a ANDing os resultados das duas primeiras declarações.

    2. RESTRINGIR

      • RESTRICTsignifica que qualquer tentativa de excluir e/ou atualizar o pai falhará gerando um erro. Este é o comportamento padrão no caso de uma ação referencial não ser especificada explicitamente.

        Para um ON DELETEou ON UPDATEque não é especificado, a ação padrão é sempre RESTRICT`.

    3. SEM AÇÃO

      • NO ACTION: Do manual . Uma palavra-chave do SQL padrão. No MySQL, equivalente a RESTRICT. O MySQL Server rejeita a operação de exclusão ou atualização para a tabela pai se houver um valor de chave estrangeira relacionado na tabela referenciada. Alguns sistemas de banco de dados têm verificações adiadas e NO ACTIONé uma verificação adiada. No MySQL, as restrições de chave estrangeira são verificadas imediatamente, então NO ACTIONé o mesmo que RESTRICT.
    4. DEFINIR NULO

      • SET NULL- novamente do manual. Exclua ou atualize a linha da tabela pai e defina a coluna ou colunas de chave estrangeira na tabela filha como NULL. Esta não é a melhor das idéias IMHO, principalmente porque não há como "viajar no tempo" - ou seja, olhar para as tabelas filhas e associar registros com NULLs com o registro pai relevante - CASCADEou use TRIGGERs para preencher tabelas de log para rastrear mudanças (mas, veja comentários).
    5. CONJUNTO PADRÃO

      • SET DEFAULT. Ainda outra parte (potencialmente muito útil) do padrão SQL que o MySQL não se incomodou em implementar! Permite que o desenvolvedor especifique um valor para definir a(s) coluna(s) de chave estrangeira em um UPDATE ou DELETE. O InnoDB e o NDB rejeitarão as definições de tabela com uma SET DEFAULTcláusula.

    Como mencionado acima, você deve gastar algum tempo olhando a documentação, aqui .

    • 128
  2. jynus
    2014-08-23T00:02:47+08:002014-08-23T00:02:47+08:00

    Essas duas são ações a serem executadas, respectivamente, quando o registro referenciado na tabela pai altera seu id e quando é excluído.

    Se você executar:

    UPDATE parent SET id = -1 WHERE id = 1;
    

    E há pelo menos um registro childcom parent_id = 1, 1) falhará; nos casos 2) e 3), todos os registros com parent_id = 1 são atualizados para parent_id = -1.

    Se você executar:

    DELETE FROM parent WHERE id = 1;
    

    E há pelo menos um registro childcom parent_id = 1, 2) falhará; nos casos 1) e 3), todos os registros com parent_id = 1são apagados.

    3) está sintaticamente correto.

    A documentação completa pode ser encontrada no manual .

    • 9
  3. g r
    2015-05-06T08:34:27+08:002015-05-06T08:34:27+08:00

    Não tenho reputação suficiente para comentar as respostas anteriores. Então pensei em elaborar um pouco.

    1) ON DELETE CASCADE significa que se o registro pai for excluído, todos os registros filho de referência também serão excluídos. O padrão ON UPDATE é RESTRICT, o que significa que o UPDATE no registro pai falhará.

    2) A ação ON DELETE tem como padrão RESTRICT, o que significa que a DELETE no registro pai falhará. ON UPDATE CASCADE atualizará todos os registros filho de referência quando o registro pai for atualizado.

    3) Veja as ações CASCADE em 1) e 2) acima.

    Ao usar IDs de registro pai como chaves estrangeiras (em tabelas filhas) - a experiência diz a) se os IDs forem números de sequência gerados automaticamente, NÃO os use como chaves estrangeiras. Em vez disso, use alguma outra chave pai exclusiva. b) se os IDs forem GUIDs, não há problema em usá-los como chaves estrangeiras. Você verá a sabedoria nesta sugestão ao exportar e importar os registros ou copiar registros para outro banco de dados. É muito complicado lidar com números de sequência gerados automaticamente durante a migração de dados quando eles são referenciados como chaves estrangeiras.

    • 7

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

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

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 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

    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
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • 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
    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