MySQL: попытка создать таблицу путем объединения двух таблиц с одинаковым именем ключа

0

Я пытаюсь создать таблицу, соединяя 2 таблицы с одним и тем же именем.

create table join_ as 
select *
FROM sakila.film_actor fa  join sakila.film_category fc
on fa.film_id = fc.film_id;

Он вернул это:

Код ошибки: 1060. Дублируемое имя столбца 'film_id'

Он работает нормально, если я только выбираю столбцы вместо создания таблицы. Как я могу сделать это без исчерпывающего перечисления всех имен столбцов или изменения исходной таблицы? Есть ли способ удалить один из "film_id" или изменить его?

Спасибо!!! Я новичок в SQL и надеюсь, что правильно описал свою проблему.

  • 2
    Вам нужно будет перечислить имена столбцов. Вы можете выбрать fa. * И перечислить только те, что в fc (или наоборот).
  • 0
    Насколько сложно копировать имена столбцов из результата запроса select?
Теги:

3 ответа

1

Вы можете сделать Natural Join:

create table join_ as 
select *
from film_actor fa natural join film_category fc

Используйте это с осторожностью, так как это объединит все одинаково названные столбцы в один каждый.

  • 0
    Это работает! Спасибо! Но это подводит меня к другому вопросу. Что делать, если есть общий ключ, который не имеет отношения к слиянию. Скажем, столбец с именем «last_update_time». Две таблицы были обновлены в разное время, и вы наверняка не захотите присоединяться к этой таблице.
  • 0
    В запросе DML естественное соединение обычно не подходит. Но вы создаете новую таблицу и хотите избежать предоставления всех имен столбцов. Здесь я нахожу логичным, что равные столбцы объединяются в один, и новая таблица не будет / не может содержать два столбца с одинаковым именем.
Показать ещё 1 комментарий
0

Как правило, лучше перечислять столбцы явно, особенно для представления. Если вы не хотите, вы можете использовать, using условие:

create table join_ as 
    select *
    from sakila.film_actor fa join
         sakila.film_category fc
         using (film_id);

Это будет работать, если film_id является единственным общим именем столбца между таблицами.

Я сильно, решительно, решительно препятствую вам использовать natural join для этой цели. Во-первых, он использует все столбцы с одинаковым именем. Итак, если другой столбец имеет то же имя (например, createdAt в большинстве createdAt таблиц), тогда join, вероятно, будет фильтровать строки. Отладка такой проблемы очень сложная. И добавление столбца в обе таблицы - после создания представления - может привести к сбою.

Я описываю natural join как мерзость, особенно потому, что он не использует правильно объявленные внешние ключи для ключей join. Вместо этого он просто использует столбцы, которые имеют одно и то же имя.

  • 0
    Спасибо! Это экономит мое время при написании предложения «on». Однако это также приводит к дублированию имени столбца.
  • 0
    @XingruDeng. , , Какой дубликат имени столбца? Дубликат не будет film_id .
Показать ещё 3 комментария
0

Проблема в *. Есть два столбца с тем же именем. При создании таблицы все имена столбцов должны быть разными. В качестве примера вы можете сделать что-то вроде:

create table join_ as 
select
   fa.film_id as a_film_id, 
   fc.film_id as c_film_id
  FROM sakila.film_actor fa
  join sakila.film_category fc on fa.film_id = fc.film_id
  • 0
    Спасибо! Да. Звезда это проблема! Это работает отлично. Но если я напишу запрос таким образом, у меня может получиться написать больше имен столбцов, чем я хочу. Проверка на упущение ослепит меня. Есть ли элегантный способ использовать * и переименовать определенный столбец одновременно?
  • 0
    Я хотел бы, чтобы это было. Лучшее, что я могу понять на данный момент, - это выбрать таблицу с наибольшим количеством столбцов и использовать * на этом; затем я select a.*, b.col1, b.col2, b.col3 ... список имен столбцов на другом: select a.*, b.col1, b.col2, b.col3 ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню