2008-10-21 5 views
4

Есть ли способ объединить два первичных ключа в один, а затем каскад обновить все затронутые отношения? Вот сценарий:Merge Primary Keys - Cascade Update

Клиенты (idCustomer INT PK, VARCHAR Company (50), и т.д.)

клиентыКонтакты (idCustomerContact INT PK, idCustomer INT FK, Name VARCHAR (50), и т.д.)

CustomerNotes (idCustomerNote int PK, idCustomer int FK, текст примечания и т. д.)

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

Любые идеи?

+0

Вы действительно имеете в виду сливание? Кажется, вы имеете в виду «заменить». Потому что вы не можете иметь, например, 2 строки в клиенте с тем же идентификатором. – mohammedn 2008-10-21 22:50:57

+0

Ну, я бы хотел, чтобы один клиент сохранил свой идентификатор, а другой - идентификатор. Я думаю, это можно было бы назвать заменой, я просто использую слияние в том смысле, что два клиента сливаются в один. – 2008-10-21 23:51:53

ответ

3

Нет автоматического способа сделать это, но у вас есть пара вариантов, вы можете вручную написать процедуры, или вы можете либо сгенерировать слияние, либо регулярно генерировать его во время выполнения. Для этого вы можете использовать команды INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS и INFORMATION_SCHEMA.KEY_COLUMN_USAGE и INFORMATION_SCHEMA.TABLE_CONSTRAINTS и INFORMATION_SCHEMA.COLUMNS and INFORMATION_SCHEMA.TABLES для динамического создания процедуры.

Вы также можете просто обернуть всю операцию в транзакции (в любом случае это хорошая идея). Последний шаг будет состоять в том, чтобы удалить клиента, из которого вы слились, поэтому, если в таблице, которую вы никогда не добавляли, и вы пытаетесь выполнить слияние, это не произойдет, потому что вы не можете удалить клиента, слитого из него, поскольку есть зависимые записи в таблицу, которая еще не была добавлена ​​в процедуру слияния.

0

Рассмотрите возможность использования триггеров. При обновлении Клиентов (столбец idCustomer) вы выполняете любые необходимые изменения (Удалить, Обновить ...) в связанных таблицах.

0

Похоже, что у вас будет две записи для каждой из этих таблиц, в которых оба имеют один и тот же первичный ключ. Это ваше намерение?

 
     Customers 
    idCustomer Company 
     1  AT&T 
     2  Cingular 

После слияния станет

 
     Customers 
    idCustomer Company 
     1  AT&T 
     1  Cingular 

В любом случае, самое будущее доказательство решение было бы написать процедуру. Вы можете пройти процедуру как для клиентов, так и для выполнения всех работ по обновлению всех таблиц по мере необходимости.

0

Не нашли то, что искали?

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

В одной транзакции: 1) Временно отключить ограничение первичного ключа на клиентов 2) Обновление Первичный идентификатор Cingular в «1», который имеет правило каскадного обновления отношения заботиться о детях 3) Использование вторичного поля ключа удалить (только) Cingular 4) Включить ограничение первичного ключа на клиентов

Глядя вперед, чтобы что-то подобное в будущем T-SQL:

уДАЛИТЬ с UPDATE idCustomer = 1 FROM Клиенты WHERE idCustomer = 2;

;-)

Смежные вопросы