[Guia de primeiros passos do MySQL] Explicação detalhada do uso de restrições de chave estrangeira

1. Por que precisamos de chaves estrangeiras?

 O MySQL é um banco de dados relacional.Na realidade, os negócios geralmente estão inter-relacionados, o que determina que as tabelas no banco de dados também estejam inter-relacionadas. A relação entre as tabelas é mantida por meio de chaves estrangeiras. Deixe-me dar um exemplo real para ajudá-lo a entender:

 Agora precisamos armazenar as informações de seleção de curso do aluno no banco de dados. Se projetarmos todas as informações específicas do curso por trás da tabela de seleção do curso do aluno, haverá muita redundância de dados:

imagem-20230428155753128

 Portanto, podemos também armazenar apenas o id do curso na tabela de seleção do curso do aluno e, em seguida, recuperar as informações específicas do curso da tabela de informações do curso por id, ou seja, precisamos estabelecer o relacionamento de mapeamento entre stu.course_id e curso.id .

imagem-20230428155835387

 Até agora, parece que implementamos a "chave estrangeira" e estabelecemos o relacionamento entre as duas tabelas por meio do id, mas não estabelecemos uma restrição de chave estrangeira . Como você entende isso?

  • Quando o administrador insere dados na tabela stu, uma inexistente pode ser inserida devido a operação incorretacourse_id
  • O curso de C++ foi excluído repentinamente da tabela de dados do curso, mas ainda há alunos que escolheram este curso na tabela stu

 Ambas as situações acima levarão ao estabelecimento de relacionamentos falsos. Em outras palavras, embora pareçamos ter implementado uma chave estrangeira semântica , as duas tabelas são essencialmente independentes. Portanto, é necessário que o MySQL mantenha uma restrição de chave estrangeira "obrigatória" e confiável.

Em segundo lugar, como definir a chave estrangeira?

foreign key (字段名) references 主表()

 Chaves estrangeiras são usadas para definir relacionamentos entre tabelas master e slave. A restrição de chave estrangeira é definida principalmente na tabela escrava, e a tabela mestre deve ter uma restrição de chave primária ou uma restrição de chave exclusiva . Quando a chave estrangeira é definida, é necessário que os dados da coluna da chave estrangeira existam na coluna da chave primária da tabela principal ou sejam null . No caso acima, a tabela stu pertence à tabela slave e a tabela course pertence à tabela master.

  • criar tabela mestre

    mysql> create table course(
        -> id int primary key,
        -> name varchar(20) not null,
        -> time varchar(64) not null
        -> );
    Query OK, 0 rows affected (0.02 sec)
    
  • criar a partir da tabela

    mysql> create table stu(
        -> id int primary key,
        -> name varchar(10) not null,
        -> course_id int,
        -> foreign key(course_id) references course(id) -- 设置外键
        -> );
    Query OK, 0 rows affected (0.05 sec)
    
  • Inserir dados normalmente

    mysql> insert into course values(11, 'C++', '9:00am');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> insert into stu values(100, '张三', 11);
    Query OK, 1 row affected (0.00 sec)
    
  • O curso inserido não existe. A inserção falha sob restrição de chave estrangeira

    mysql> insert into stu values(101, '李四', 12);
    ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`db`.`stu`, CONSTRAINT `stu_ibfk_1` FOREIGN KEY (`course_id`) REFERENCES `course` (`id`))
    
  • O valor que pode ser inserido é NULL , indicando que nenhum curso foi selecionado

    mysql> insert into stu values(101, '李四', NULL);
    Query OK, 1 row affected (0.00 sec)
    
  • Falha ao excluir um curso sob uma restrição de chave estrangeira porque ainda há alunos fazendo este curso

    mysql> delete from course where id=11;
    ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`db`.`stu`, CONSTRAINT `stu_ibfk_1` FOREIGN KEY (`course_id`) REFERENCES `course` (`id`))
    

Acho que você gosta

Origin blog.csdn.net/whc18858/article/details/130440371
Recomendado
Clasificación