Ошибка SQL-сервера: оператор INSERT конфликтовал с ограничением CHECK

При контакте с индексами необходимо определить то, для чего таблица будет используемой. Если Вы, прежде всего, вставляете 1 000 строк в секунду и не делаете какие-либо запросы, то кластерный индекс имеет успех к производительности. Если Вы сделаете 1 000 запросов в секунду, то не наличие индекса приведет к очень плохой производительности. Лучшая вещь сделать при попытке настроить запросы/индексы состоит в том, чтобы использовать План запросов Анализатор и SQL Profiler в SQL Server. Это покажет Вам, где Вы сталкиваетесь с дорогостоящими сканированиями таблицы или другими блокировщиками производительности.

Что касается GUID по сравнению с идентификационным аргументом, можно найти людей онлайн, которые клянутся обоими. Мне всегда преподавали использовать GUID, если у меня нет действительно серьезного основания не к. У Jeff есть хорошее сообщение, которое говорит о причинах использования GUID: https://blog.codinghorror.com/primary-keys-ids-versus-guids / .

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

[Редактирование] @Matt, после выполнения еще некоторого исследования в области GUID/идентификатора дебатируют, я столкнулся с этим сообщением. Как я упомянул прежде, нет истинного права, или неправильно ответьте. Это зависит от Ваших определенных потребностей реализации. Но это некоторые довольно допустимые причины использовать GUID в качестве первичного ключа:

, Например, существует проблема, известная как "горячая точка", где определенные страницы данных в таблице находятся под относительно высокой конкуренцией валюты. В основном, что происходит, большая часть трафика в таблице (и следовательно блокировки уровня страницы) происходит на небольшой площади таблицы, к концу. Новые записи будут всегда переходить к этой горячей точке, потому что ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ являются генератором порядкового номера. Эти вставки неприятны, потому что они требуют, чтобы страница Exlusive соединила страницу, они добавляются к (горячая точка). Это эффективно сериализирует всех, вставляет в таблицу благодаря механизму фиксации страницы. NewID (), с другой стороны, не страдает от горячих точек. Значения генерировали использование NewID (), функция только последовательна для кратковременных вспышек вставок (где функция вызывается очень быстро, такой как во время многострочной вставки), который заставляет вставленные строки распространяться случайным образом всюду по страницам данных таблицы вместо всех в конце - таким образом устранение горячей точки от вставок.

кроме того, потому что вставки случайным образом распределяются, шанс расщеплений страницы значительно уменьшается. В то время как расщепление страницы тут и там не слишком плохо, эффекты действительно складывают быстро. С ИДЕНТИФИКАЦИОННЫМИ ДАННЫМИ страница Fill Factor довольно бесполезна как настраивающийся механизм и могла бы также быть установлена на 100% - строки никогда не будут вставляться ни в какую страницу, но последнюю. С NewID (), можно на самом деле использовать Коэффициент заполнения как включающий производительность инструмент. Можно установить Коэффициент заполнения на уровень, который приближается, предполагаемый рост объема между индексом восстанавливает, и затем запланируйте восстанавливание в течение часов неполной нагрузки с помощью dbcc переиндекс. Это эффективно задерживает хиты производительности расщеплений страницы до непиковых времен.

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

еще одно огромное преимущество для использования GUID для PKs является тем, что значение действительно гарантируется уникальное - не только среди всех значений, сгенерированных этот сервер, но все значения, сгенерированные весь компьютеры - ли это быть Вашим сервером дб, веб-сервером, сервером приложений или клиентской машиной. В значительной степени каждый современный язык имеет возможность генерации допустимого гуида теперь - в.NET, можно использовать Систему. Гуид. NewGuid. Это ОЧЕНЬ удобно при контакте с кэшируемыми наборами данных основной детали в частности. Вы не должны использовать сумасшедшие временные схемы манипулирования только для связи записей вместе, прежде чем они будут фиксироваться. Вы просто выбираете совершенно допустимый новый Гуид от операционной системы для постоянного значения ключа каждой новой записи в то время, когда запись создается.

http://forums.asp.net/t/264350.aspx

5
задан OMG Ponies 30 September 2009 в 04:11
поделиться

2 ответа

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

Чтобы узнать, что такое ограничение проверки, попробуйте следующее :

SELECT
name, definition 
FROM
    sys.check_constraints
WHERE
    name = 'ck_str_member_no'

Это даст вам выражение, которое проверяется в столбце "определение".

По этому выражению вы сможете определить, почему ваша вставка отклоняется. Устраните проблему и вставьте снова.

Если вы действительно не можете исправить свои данные, и если вам не нужно / вы не хотите, чтобы это ограничение проверки действовало, вы можете удалить его:

ALTER TABLE dbo.Members
   DROP CONSTRAINT ck_str_member_no

Marc

14
ответ дан 18 December 2019 в 10:46
поделиться

Очевидно, INSERT предоставляет значение для столбца 'str_member_no', от которого SQL было приказано отказаться, учитывая ПРОВЕРИТЬ ограничение. Контрольное ограничение - это просто условие, накладываемое на одно или несколько значений полей перед их добавлением или вставкой. Например, возможно, CHECK требует, чтобы все str_member_no были больше 1500 (более низкие значения используются, скажем, для администраторов ...) или какое-то другое нечетное «бизнес-правило».

Путем проверки или публикации здесь DDL для создания базовой таблицы, а также для рассматриваемого оператора INSERT вы могли бы получить конкретное представление о том, что не так со значением (или с предикатом проверки).

При чтении кода, добавленного в вопрос, str_member_no, похоже, не проверяется, тогда может быть просто переданное значение слишком длинное или нулевое, или какая-то другая общая причина для отказа от него; ошибка обычно будет другой, но поскольку есть проверка, показанная ошибка основана на предположении, что [пользовательская] проверка не удалась.

В любом случае, вы должны проверить, какие значения передаются в AddNewAGCMember () StoredProcedure; проблема, вероятно, заключается в "плохом" значении поля.

В любом случае вы должны проверить, какие значения передаются в StoredProcedure AddNewAGCMember (); проблема, вероятно, заключается в "плохом" значении поля.

В любом случае вы должны проверить, какие значения передаются в StoredProcedure AddNewAGCMember (); проблема, вероятно, заключается в "плохом" значении поля.

2
ответ дан 18 December 2019 в 10:46
поделиться