T-SQL Query для исправления плохих отношений - PullRequest
0 голосов
/ 31 января 2012

ОК, я использую SQL Server 2008 R2 и у меня есть пара отношений, которые мне нужно немного перемешать. Вот мой пример дизайна базы данных (не актуально, но показывает проблему).

Table - Products
Columns: ProductID - primary key
         ProductInfo - irrelevant to problem
         ModelID - foreign key to Models table
         MfgrID - foreign key to Mfgrs table

Table - Models
Columns: ModelID - primary key
         ModelInfo - irrelevant to problem

Table - Mfgrs
Columns: MfgrID - primary Key
         MfgrInfo - irrelevant to problem

В этом сценарии Продукт является одной из Моделей и производится Mfgr. Что мне нужно сделать, так это связать таблицу Mfgrs с таблицей Models, поскольку данная модель сделана Mfgr, а наличие отдельных ссылок на конечный продукт - это, ну, плохой дизайн?

Это моделирует реальную базу данных с живыми данными, так что это не просто упражнение. То, что я хочу сделать, это добавить столбец к моделям, назвать его MfgrID и создать связь между моделями и Mfgrs. Тогда Mfgr будет иметь отношение один-ко-многим с Моделями, а Модели будут иметь отношение один-ко-многим к Продуктам, и мир станет лучше!

Ну, мой мир в любом случае будет лучше.

Я хотел бы создать новые отношения на основе старых, чтобы каждая модель получала MfgrID это указывает на Mfgr для любого данного продукта этой модели. Как только это будет установлено, я вернусь и удалю отношения Products to Mfgrs.

Есть вопросы? Я ценю любые идеи, я все время путаюсь, пытаясь сформулировать краткий запрос для этого ...

Dave

1 Ответ

2 голосов
/ 31 января 2012

Если у вас есть только один продукт для каждой модели, это должно быть сделано;

ALTER TABLE Models ADD MfgrID INT NULL FOREIGN KEY REFERENCES Mfgrs(MfgrID);

UPDATE m SET MfgrID = p.MfgrID 
  FROM Models m JOIN Products p ON m.ModelID=p.ModelID;

и, возможно, в конце, если вы хотите, чтобы MfgrID был обязательным, и у вас нет пустых значений в этом столбце;

ALTER TABLE Models ALTER COLUMN MfgrID INT NOT NULL;

И просто чтобы убедиться, что вы никогда не должны запускать чьи-либо случайные сценарии из Интернета в вашей производственной базе данных без предварительного тестирования; -)

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