Связать две таблицы одним совпадающим ключом в SQL?

#mysql #sql #database-design #inner-join #create-table

#mysql #sql #проектирование базы данных #внутреннее соединение #create-table

Вопрос:

Я довольно новичок в SQL, и я знаю об FOREIGN KEY этом, но я не могу придумать способ связать две таблицы друг с другом с помощью сопоставления одного ключа.

Итак, например, есть пользователь с «именем», заданным как «John», и сообщение, для которого «автор» задан как «John».

Какой запрос я должен написать, чтобы SQL просматривал таблицу «пользователи», находил совпадение с автором сообщения и устанавливал a FOREIGN KEY в идентификатор этого пользователя?

Ответ №1:

Предполагая, что у вас уже есть users и posts таблица, где posts есть user_id foreign key ссылка users.id , вы можете сделать что-то вроде этого:

 update posts
join users
on posts.author = users.name
set posts.user_id = users.id;
 

Проблема, с которой вы можете столкнуться, заключается в том, что некоторые имена могут быть дубликатами.

Ответ №2:

Это отношение «один ко многим».

Вы бы построили таблицы следующим образом:

 create table users (
    user_id int primary key auto_increment,
    name varchar(50)
);

create table posts (
    post_id int primary key auto_increment,
    user_id int not null,
    content varchar(200),
    constraint fk_user_id foreign key (user_id) references users(user_id)
);
 

Затем вы можете использовать внешний ключ для объединения таблиц:

 select p.*, u.name as user_name
from posts p
inner join users u on u.user_id = p.user_id
 

Комментарии:

1. Я полагаю, что спрашивающий задавался вопросом о том, как обновить posts.user_id, чтобы он имел правильный users.id значение, связанное логическим отношением имя-автор, см. Мой ответ.

2. Спасибо за ваш ответ! Да, у меня есть два файла JSON, заполненных множеством пользователей и сообщений. Я собирался разобрать их на две отдельные таблицы и подумал, что лучшим способом связать их друг с другом было бы добавление ВНЕШНЕГО КЛЮЧА после заполнения обеих таблиц и выполнения определенного запроса объединения с установленными фильтрами. Единственный совпадающий ключ, который есть у них обоих, — это имя.