Обновление набора = Выбрать выписку и вопрос первичного ключа - PullRequest
0 голосов
/ 15 августа 2011

У меня есть таблица:

TRADESHOW
id
name
industry

Где отрасль в настоящее время указана в качестве текстового имени отрасли (Программное обеспечение, Оборудование, Сеть и т. Д.).Я думаю о том, чтобы перенести отрасль в отдельную таблицу, которая выглядит как лучший дизайн, а также делает данные более согласованными и облегчающими добавление или редактирование моими приложениями различных отраслей.Новая таблица будет иметь вид:

INDUSTRY
id
name

И TRADESHOW.industry станет TRADESHOW.industry_id

Мои вопросы:

  1. Имеет ли это изменение смысл?Должна ли таблица IND enter code here USTRY даже иметь суррогатный ключ (INDUSTRY.id) или один столбец INDUSTRY.name имеет больше смысла в качестве первичного ключа?

  2. Что будетлучший способ сформировать оператор UPDATE для исправления таблицы TRADESHOW после реализации таблицы INDUSTRY?Я думаю, мне понадобится UPDATE с оператором SELECT?Предполагая, что имеет смысл сохранить суррогатный ключ в промышленности, я думаю что-то вроде:

..

UPDATE tradeshow SET tradeshow.industry =
(SELECT id FROM industry WHERE tradeshow.industry=industry.name)

Будет ли это работать?(Я знаю, что это не будет идеально, так как названия отрасли сейчас не на 100% последовательны.) Есть ли лучший способ?Спасибо!

Ответы [ 4 ]

1 голос
/ 17 августа 2012

Это работает для меня:

UPDATE appm_personnel SET appm_personnel.`PASSWORD`=(
   SELECT authorise.authorise_pass
   FROM authorise 
   WHERE authorise.authorise_idcard = appm_personnel.ID_CODE LIMIT 1 )
WHERE LENGTH(appm_personnel.ID_CODE)=13
1 голос
/ 15 августа 2011
  1. У вас обязательно должна быть отраслевая таблица, это хорошая практика проектирования, основанная на третьей нормальной форме, и первичным ключом может быть идентификатор (как у вас). Таблица TRADESHOW будет иметь indsutry_id в качестве FK, Name также будет хорошим первичным ключом, но, как правило, при большом количестве ссылок на FK хранилище может стать большим.

  2. То, как вы сейчас это делаете, не будет работать, если в вашей таблице INDUSTRY есть две записи с одинаковым названием отрасли. Я предполагаю, что вы заполняете таблицу из существующей таблицы TRADESHOW? в этом случае вы создадите SELECT UNIQUE для создания таблицы INDUSTRY, поэтому она ДОЛЖНА быть уникальной. И тогда вы можете запустить запрос на обновление, который вы используете впервые.

0 голосов
/ 15 августа 2011
  1. Да, это имеет смысл. Но подумайте, действительно ли вам нужна эта нормализация. Если это имеет смысл для вас, это должно быть сделано. О ПК: Как правило, всегда иметь первичный ключ идентификатора для лучшей производительности и согласованности. Его практически никогда не удастся удалить.

  2. Швы почти правые:

    ALTER to add tradeshow.industry_id
    UPDATE tradeshow SET tradeshow.industry_id =
    (SELECT id FROM industry WHERE tradeshow.industry=industry.name)
    ALTER to remove tradeshow.industry
    
0 голосов
/ 15 августа 2011

Имеет смысл перейти на другую таблицу для отрасли, если для одного и того же идентификатора, имени в TradeShow, у вас есть несколько отраслей.Если вы решите пойти дальше с отдельной таблицей для Industry, я бы посоветовал включить Industry_Id в таблицу TradeShow вместо Industry_Name

TradeShow
Id
Name
IndustryId

Industry
Id
Name

. Учитывая это, ваше заявление об обновлении будет

Update TradeShow
Set Tradeshow.IndustryId = (Select Id From Industry where Name = 'abs')
Where TradeShow.Id = 12

Где Industry.Name и TradeShow.Id являются входными данными

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...