Estou usando o MySQL versão 8.3.0.
Posso criar um relacionamento “muitos para muitos” entre tabelas de pessoas e equipes com as seguintes instruções SQL:
create table persons (
id bigint not null,
last_name varchar(255) not null,
first_name varchar(255),
primary key (id)
);
create table teams (
id bigint not null,
team_name varchar(255) not null,
primary key (id)
);
create table person_team (
person_id bigint not null,
team_id bigint not null,
primary key (person_id, team_id),
constraint fk_person_team_person foreign key (person_id) references persons(id),
constraint fk_person_team_team foreign key (team_id) references teams(id)
);
Portanto, a person_team
tabela possui uma chave primária composta e cada uma de suas colunas é uma chave estrangeira para as tabelas às quais ela une.
Se eu recuperar a instrução DDL para person_team
with show create table person_team;
, isso me dará o seguinte SQL:
CREATE TABLE `person_team` (
`person_id` bigint NOT NULL,
`team_id` bigint NOT NULL,
PRIMARY KEY (`person_id`,`team_id`),
KEY `fk_person_team_team` (`team_id`),
CONSTRAINT `fk_person_team_person` FOREIGN KEY (`person_id`) REFERENCES `persons` (`id`),
CONSTRAINT `fk_person_team_team` FOREIGN KEY (`team_id`) REFERENCES `teams` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
Assim, ele adiciona automaticamente uma KEY
instrução (linha 5) com o nome chave estrangeira à teams
tabela.
Por que esse comportamento? Esta KEY
instrução extra não parece necessária para mim. Por que mostra uma chave para fk_person_team_team
e não para fk_person_team_person
? A afirmação inicial está errada ou incompleta? O DDL gerado automaticamente está correto? Quando despejo meu banco de dados com mysqldump
, obtenho o mesmo código do DDL gerado automaticamente. É mais seguro modificar este código para restaurar o banco de dados?