обновить часть ключа - PullRequest
2 голосов
/ 17 мая 2011

Q:

Если у меня есть составной ключ , объединенный, например, из 4 полей, могу ли я обновить одно из них?

Я имею в виду, могу ли я выполнить операторкак это:

UPDATE tb 
SET firstCol = '15', secondCol = 'test2' 
WHERE firstCol = '1' AND serial = '2';

Дано:

  • мое имя таблицы: tb
  • мои поля: firstCol, secondCol, serial
  • мои ключи: firstCol , serial

Есть предложения?Я что-то пропустил?

спасибо.

Ответы [ 3 ]

4 голосов
/ 17 мая 2011

Конечно, вы можете сделать это, почему?У вас есть проблемы с этим?

3 голосов
/ 17 мая 2011

Вы можете столкнуться с проблемами при обновлении, если попытаетесь преобразовать некоторые строки в те же значения, что и в существующие строки.Независимо от того, что вы делаете в обновлении, ограничение по-прежнему будет применяться.

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

Лично, если вам нужно сменить PK, дизайн вашей базы данных хрупок и может вызвать проблемы в будущем.Особенно с многоколоночным ключом.Если это единовременное, редкое изменение, продолжайте и работайте над проблемами.В противном случае, возможно, пришло время решить, является ли лучшим выбором наличие суррогатного ключа в качестве PK и уникального индекса для нескольких столбцов.Многоколоночные PK создают гораздо большие индексы не только для основной таблицы, но и для дочерних таблиц, они могут создавать сложные проблемы, когда вам нужно обновить один из столбцов, и они влияют на производительность для объединений.Вообще я их не фанат.И, конечно, нет, если есть некоторые из этих столбцов, которые нужно будет обновлять с любой частотой (и под этим я подразумеваю любое крупное обновление чаще, чем раз в год - одна или две записи в порядке, но если вы запускаете обновление, как описано чащераз в год нужно пересмотреть дизайн на мой взгляд.).

3 голосов
/ 17 мая 2011

Да, вы можете. Это может быть часть ключа, но это все еще столбец.

Примечание: если у вас есть FK, полагающиеся на этот ключ, вам нужно будет рассмотреть обновления CASCASE. Кроме того, обновление ключа (при условии его кластеризации) означает больше работы, чем «нормального», из-за того, как некластеризованные индексы относятся к кластерному ключу

...