Сообщение 547 sql server

Обновлено: 28.03.2024

Ошибка будет, т.к. надо понимать что делает здесь LIKE.
В приведенном примере проверка на ввод цифр во всех 12-позициях должна быть такой:

Не больше, не меньше.

Никак не получается понять ТС. Почему он упорно пытается нагрузить сервер СУБД этой ерундой. Такие проверки делаются на клиенте.

Вот, например. Неверно ввели ИНН и далее прога отправляет его на сервер.
Сервер проверяет (по условиям CHECK) и возмущенно ругается. Наверняка разработчик в этом случае будет посылать исключение на клиента. А клиент, в свою очередь, будет пытаться понять что произошло и все равно займется проверкой введенного значения.
Так зачем же такие ректальные операции над гландами, когда можно спокойно, до отправки данных на сервер, проверить все ли гладко с данными и только затем отправлять их в БД?

Я получаю следующую ошибку. Не могли бы вы мне помочь?

Код:

Последний столбец client_id вызывает ошибку. Я попытался поместить значение, которое уже существует в dbo.Sup_Item_Cat в столбец, соответствующий sup_item.. но без радости 🙁

В вашей таблице dbo.Sup_Item_Cat он имеет ссылку внешнего ключа на другую таблицу. Способ работы FK заключается в том, что он не может иметь значение в этом столбце, которое также не находится в столбце первичного ключа ссылочной таблицы.

Если у вас есть SQL Server Management Studio, откройте его и sp_help ‘ dbo.Sup_Item_Cat . Посмотрите, в каком столбце включен FK, и в каком столбце которого он ссылается. Вы вставляете некоторые плохие данные.

Сообщите мне, если вам что-то объяснено лучше!

Несмотря на то, что проверенный ответ является правильным:

Майк М wrote-

“Способ работы FK заключается в том, что он не может иметь значение в этом столбце, которого нет также в столбце первичного ключа в указанной таблице”.

Чего не хватает в этом ответе просто;

Сначала вы должны создать таблицу, содержащую первичный ключ.

Еще один способ сказать это;

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

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

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

Вы пытаетесь вставить запись со значением в столбце внешнего ключа, которого нет во внешней таблице.

Например: если у вас есть таблицы “Книги” и “Авторы”, в которых “Книги” имеют ограничение внешнего ключа для таблицы “Авторы”, и вы пытаетесь вставить запись книги, для которой нет записи об авторе.

Вам нужно будет опубликовать свое выражение для получения дополнительных разъяснений. Но…

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

Проблема не в client_id из того, что я вижу. Это больше похоже на проблему с 4-м столбцом, sup_item_cat_id

Я обнаружил, что все поля должны соответствовать ТОЧНО.

Например, отправка “cat dog” не совпадает с отправкой “catdog”.

То, что я сделал для устранения этого неполадки, заключалось в script из кода FK из таблицы, в которую я вставлял данные, обратите внимание на “Foreign Key” с ограничениями (в моем случае было 2) и убедитесь, что эти 2 значения полей соответствовали ТОЧНО, поскольку они были в таблице, которая бросала ошибку ограничения FK.

Как только я исправил 2 поля, дающие мои проблемы, жизнь была хорошей!

Если вам нужно лучшее объяснение, сообщите мне.

Это означает именно то, что он говорит. Вы пытаетесь вставить значение в столбец с ограничениями FK на нем, который не соответствует никаким значениям в таблице поиска.

Данные родительской таблицы не существуют, поэтому она вызывает проблему. Для вышеуказанной проблемы данные недоступны в таблице dbo.Sup_Item_Cat “

Дважды проверьте поля в отношении, для которого задан внешний ключ. SQL Server Management Studio, возможно, не выбрали нужные вам поля при определении отношения. Это сожгло меня в прошлом.

  • запустить sp_helpconstraint
  • заплатите ВНИМАНИЕ столбцу constraint_keys, возвращенному для внешнего ключа.

Отсутствие данных родительской таблицы вызывает проблему.
В вашей проблеме не доступность данных в “dbo.Sup_Item_Cat” вызывает проблему

У меня была такая же проблема, когда я использовал первые преобразования кода для создания моей базы данных для приложения MVC 5. В конце концов я нашел метод seed в моем файле configuration.cs, чтобы вызвать проблему. Мой метод seed создавал запись таблицы для таблицы, содержащей внешний ключ, перед созданием записи с соответствующим первичным ключом.

Я столкнулся с этой проблемой, когда мои поля значений вставки содержали вкладки и пробелы, которые не были очевидны для невооруженного глаза. Я создал свой список значений в Excel, скопировал и вставил его в SQL, и запустил запросы, чтобы найти несоответствия в моих FK-полях.

В запросах совпадения не было обнаружено, что в моем поле FK есть вкладки и пробелы, но INSERT распознал их и продолжал генерировать ошибку.

Я снова тестировал, копируя содержимое поля FK в одной записи и вставляя его в запрос вставки. Когда эта запись также потерпела неудачу, я подошел ближе к данным и, наконец, обнаружил вкладки/пробелы.

Как только я очистил удаленные вкладки/пробелы, моя проблема была решена. Надеюсь, это поможет кому-то!

Я также получил ту же ошибку в моем коде SQL, это решение работает для меня,

Проверьте данные в первичной таблице. Возможно, вы вводите значение столбца, которого нет в столбце первичного ключа.

Иногда это происходит, когда вы пытаетесь Insert/Update объект, в то время как foreign key который вы пытаетесь Insert/Update самом деле не существует. Поэтому убедитесь, что foreign key существует, и повторите попытку.

Мне нужно создать таблицу group со столбцом code. Можно ли добавить ограничение на столбец, которое допускало бы только буквенные символы (D, M, O, P или T) с последующими двумя цифровыми символами?

Ему ответили:

Попробуем разобраться

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

Оно допускает только буквенные символы (D, M, O, P или T) с последующими двумя цифровыми символами. Ладно, хватит разговоров, давайте перейдем к коду

Создадим таблицу


Добавим проверку ограничения


Теперь несколько инструкций для вставки данных

Если вы хотите выполнить вставку D12, а не d12, т.е. нужна чувствительность к регистру, тогда нужно создать такое ограничение


Все, что потребовалось изменить — добавить параметр сортировки SQL_Latin1_General_CP1_CS_AS.

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


Вот, что вернул запрос в описании

Latin1-General, case-sensitive, accent-sensitive, kanatype-
insensitive, width-insensitive for Unicode Data, SQL Server Sort Order 51 on Code Page 1252 for non-Unicode Data

Давайте создадим новое ограничение, но прежде нам нужно удалить старое


Теперь создаем новое и проверяем


Вставка значения D12 будет успешной, а d12 — нет.
Как видите, использовать регулярные выражения в ограничениях можно и никакой триггер в данном случае не нужен.

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

В тесте есть два набора текста, которые ищет код, и я не могу понять, в чем разница, поэтому мне неудобно просто проверять номер ошибки 547.

  • Оператор DELETE противоречит ограничению REFERENCE.
  • Оператор DELETE противоречит ограничению SAME TABLE REFERENCE.

547 - это код ошибки, используемый для любого нарушения ограничения, а не только внешние ключи, например:

При этом я не могу придумать какой-либо другой тип ограничения, кроме внешнего ключа, который может быть нарушен оператором DELETE . (подсказка Hat для @onedaywhen)

Если вы посмотрите в sys.messages , вы увидите, что 547 должно быть для нарушения ограничений:

Оператор% ls противоречил ограничению% ls "%. * ls". Конфликт произошел в базе данных "%. * Ls", таблица "%. * Ls" % ls%. * Ls% ls.

Конфликт инструкции INSERT с ограничением FOREIGN KEY "FK__Вакансия__Вид_де__3DE82FB7". Конфликт произошел в базе данных "Job", таблица "dbo.Вид_деятельности", column 'Вид_деятельности_id'.

Выполнение данной инструкции было прервано.

(строк обработано: 1)

(строк обработано: 1)

(строк обработано: 1)

(строк обработано: 1)

Конфликт инструкции INSERT с ограничением FOREIGN KEY "FK__Вакансия__Вид_де__3DE82FB7". Конфликт произошел в базе данных "Job", таблица "dbo.Вид_деятельности", column 'Вид_деятельности_id'.

Выполнение данной инструкции было прервано.

Конфликт инструкции INSERT с ограничением FOREIGN KEY "FK__Вакансия__Вид_де__3DE82FB7". Конфликт произошел в базе данных "Job", таблица "dbo.Вид_деятельности", column 'Вид_деятельности_id'.

Выполнение данной инструкции было прервано.

(строк обработано: 1)

(строк обработано: 1)

Конфликт инструкции INSERT с ограничением FOREIGN KEY "FK__Вакансия__Вид_де__3DE82FB7". Конфликт произошел в базе данных "Job", таблица "dbo.Вид_деятельности", column 'Вид_деятельности_id'.

Выполнение данной инструкции было прервано.

Конфликт инструкции INSERT с ограничением FOREIGN KEY "FK__Вакансия__Вид_де__3DE82FB7". Конфликт произошел в базе данных "Job", таблица "dbo.Вид_деятельности", column 'Вид_деятельности_id'.

Выполнение данной инструкции было прервано.

Конфликт инструкции INSERT с ограничением FOREIGN KEY "FK__Вакансия__Вид_де__3DE82FB7". Конфликт произошел в базе данных "Job", таблица "dbo.Вид_деятельности", column 'Вид_деятельности_id'.

Выполнение данной инструкции было прервано.

А ты компилируешь сразу весь код, или делаешь это по порядку? Если ты компилируешь сразу всё, то по этой причине у тебя не получается. А и вот это FOREIGN KEY (Вид_деятельности_id) REFERENCES Вид_деятельности (Вид_деятельности_id)ON UPDATE CASCADE ON DELETE CASCADE );
оно разве не в alter table пишется? Я уже не помню.

Читайте также: