2010-03-24 5 views
0

У меня есть простая таблица (давайте назовите ее Table1), которая имеет поле NVARCHAR в качестве PK. Таблица 1 не имеет отношения к каким-либо другим таблицам.LinqToSQL: невозможно обновить PrimaryKey?

Когда я обновляю столбец P1 таблицы 1, используя LinqToSQL, он терпит неудачу. Если я обновляю другой столбец, он будет успешным.

Я могу удалить эту строку и вставить новую в таблицу1, но я не хочу. Существует таблица транзакций, в которой столбец PK таблицы 1 является столбцом.

Когда PK таблицы 1 изменен, я не хочу эффекта в таблице транзакций. Но когда строка из Таблицы 1 удалена, я хочу, чтобы строки транзакций были удалены. Каскадирование выполняется через Trigger.

Поскольку между этими двумя таблицами нет связи, если я обновляю столбец PK таблицы 1 с использованием обычного SQL, он работает и не будет влиять на таблицу транзакций, как ожидалось. Когда я удаляю строку, триггер удаляет строки из таблицы транзакций.

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

+2

Обновление первичных ключей - это запах кода в моей книге. –

+0

Первичные ключи на колонках 'varchar' или' nvarchar' - это дизайнерский запах в моей ... – Aaronaught

+0

Да, я знаю, что его не рекомендуется иметь NVARCHAR .. и я изменил дизайн. Но я хочу знать, почему невозможно обновить PK – Zuhaib

ответ

3

Как сказал Отавио, первичные ключи не должны обновляться. Создайте столбец типа Int (или BigInt) и сделайте его первичным ключом автоматической нумерации. Ваше поле NVARCHAR может просто иметь уникальное ограничение, потому что это то, что вы действительно хотите, потому что столбец не используется в отношениях с другими таблицами.

Update:

Также обратите внимание, что при использовании этого столбца в качестве первичного ключа и связать его с другими таблицами, вы не можете изменить его больше. SQL Server вызовет ошибку UPDATE statement conflicted with COLUMN REFERENCE constraint.

Далее возникают другие проблемы с изменением первичного ключа, например: производительность. Изменение первичного ключа приведет к фрагментации фрагментированных индексов.

+1

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

+0

Вы правы в этом. Но, конечно, это может привести к другим проблемам производительности. – Steven

+0

Без сомнения - я бы никогда не советовал кому-либо использовать этот метод в схеме схемы db. –

2

Первичный ключ строки предназначен для однозначной идентификации строки (в случае LINQ to SQL, Object).

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

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

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