Добавление внешних ключей в уже существующую базу данных - PullRequest
0 голосов
/ 18 июля 2011

Я пытаюсь экспортировать данные из электронной таблицы Excel в довольно сложную реляционную базу данных. В электронной таблице указаны «внешние ключи» с указанием имен других объектов. (К счастью, у меня есть некоторый контроль над таблицей, поэтому я могу гарантировать, что эти имена уникальны И что объекты, на которые они ссылаются, действительно существуют).

У меня есть программа, которая может воссоздать эти таблицы в базе данных MSSql, но не может автоматически связать их друг с другом. Кроме того, я не хочу использовать фактические имена объектов в качестве первичного ключа, поскольку в конечном итоге база данных будет большой.

Итак, если у меня есть много существующих, но не связанных таблиц, которые ссылаются друг на друга по своим полям «name», как я могу добавить внешний ключ, который связывает их по их идентификаторам?

Упрощенная версия того, что у меня есть:

Parent
ID: 1 (PK)
Name: Mary

Child
ID: 2 (PK)
Name: Jane
ParentName: Mary

И чего я хочу добиться:

Child
ID: 2 (PK)
Name: Jane
ParentID: 1 (FK)

Спасибо за любую помощь! Я не смог найти пример того, как добавить сопоставление внешнего ключа после факта или в другом поле.

Ответы [ 2 ]

5 голосов
/ 18 июля 2011

См. Синтаксис ALTER TABLE для MSSQL. Вы можете придумать что-то вроде этого, чтобы добавить ограничение в таблицу:

ALTER Child
ADD CONSTRAINT Child_Parent_FK FOREIGN KEY (ParentID) REFERENCES Parent(ID)

Затем, когда ограничение введено, попробуйте что-то вроде:

UPDATE Child 
SET ParentID = (SELECT ID FROM Parent WHERE Name = ParentName)

Это должно работать, если вы можете гарантировать, что Name Родителя уникален. В противном случае вы можете добавить LIMIT 1 в конец запроса. Но если есть несколько родителей с одинаковым Name, вам нужно будет добавить дополнительную логику (которая не указана в исходном сообщении).

1 голос
/ 20 июля 2011

Так как вы собираетесь делать это регулярно, я думаю, вам следует импортировать в промежуточную таблицу. Мне нравится выделять промежуточные таблицы в их собственной схеме.

Используйте промежуточную таблицу для извлечения или генерации необходимых вам ключей, затем вставьте / обновите таблицы OLTP на основе данных в промежуточной таблице. Наконец, обрежьте промежуточный стол.

...