SQL - SQLDataAdapter Update вызывает нарушение первичного ключа - PullRequest
1 голос
/ 13 января 2010

Мне нужно иметь возможность изменять первичные ключи в таблице. Проблема в том, что некоторые ключи будут заменены на существующие значения ключей. Например. record1.ID 3 => 4 и record2.ID 4 => 5. Мне нужно сохранить их как первичные ключи, так как они установлены как внешние ключи (которые каскадно обновляются). Есть ли разумный способ сделать это, или я пытаюсь выполнить sql здесь?

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

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

ТИА

Ответы [ 2 ]

1 голос
/ 13 января 2010

Вы пытаетесь ересь sql. Я на самом деле довольно непредубежденный и знаю, много раз нужно делать вещи, которые кажутся сумасшедшими. Меня раздражает, когда люди высокомерно отвечают «вы должны сделать это по-другому», когда они знают, какова ситуация. Однако я должен сказать вам, что вы должны сделать это по-другому . хе хе.

Нет, нет элегантного способа сделать это с помощью sql \ DataAdapter. Вы можете сделать это через ADO.NET с помощью ряда команд t-sql. Вы должны каждый раз включать режим перезаписи идентификаторов (set identity_insert theTable on), выполнять запрос, в котором все значения в этой таблице увеличиваются на единицу, и затем включать режим перезаписи автономных номеров. Но тогда вам нужно будет увеличить все остальные таблицы, которые используют это как внешний ключ. Но подождите, это становится хуже:

  • Все это вам понадобится в транзакции , потому что в течение этого времени с этими таблицами не может происходить ничего другого, и потому что в случае сбоя вам, безусловно, потребуется откат Это может быть большой объем обработки; ваши столы будут заблокированы на некоторое время.
  • Если у вас есть какие-либо ограничения внешнего ключа между этими таблицами, вам нужно будет отключить их, прежде чем вы это сделаете, и повторно реализовать их впоследствии.
0 голосов
/ 13 января 2010

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

...