Составные первичные ключи SQL Server - PullRequest
0 голосов
/ 13 мая 2010

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

Я удалил все записи со значением даты 08.02.2010.Когда я пытаюсь вставить записи в таблицу для 8.02.2010, я получаю нарушение первичного ключа.Записи, которые я пытаюсь вставить, относятся только к 2/8/2010.

Поскольку дата является компонентом PK, не должно быть никакого способа нарушить ограничение, пока датавставка еще не в таблице?

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 13 мая 2010

Все ли строки содержат только компонент даты в этом поле (т. Е. Время всегда установлено в полночь: 00:00:00)? Если нет, вам нужно удалить строки> = 2/8/2010 и <2/9/2010. </p>

Кроме того, вы уверены, что не случайно пытаетесь вставить две записи с одинаковой датой (и одинаковыми значениями в других 6 полях PK)?

2 голосов
/ 13 мая 2010

В данных, которые вы вводите, могут быть дубликаты.

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

0 голосов
/ 13 мая 2010

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

Вы можете попробовать следующий SELECT, чтобы увидеть, что появляется:

ВЫБРАТЬ * FROM YOUR_TABLE ГДЕ ДАТА> 2/7/2010 И ДАТА <2/9/2010; </p>

(Не уверен насчет правильного формата константы даты в SQL Server, поскольку я не использовал ее несколько лет, но я уверен, что вы поняли идею). Посмотри, что ты получишь.

Удачи.

...