Работа с ограничениями FK - Очистка и пополнение sql server 2008 db - PullRequest
1 голос
/ 01 декабря 2010

У меня есть база данных SQL в MS SQL Server 2008 R2

В целях разработки я пытаюсь очистить все данные, а затем добавить свои фиктивные данные.

После некоторой борьбы с FK Constraints и использованием

ALTER TABLE ? NOCHECK CONSTRAINT ALL
DELETE FROM ?
ALTER TABLE ? CHECK CONSTRAINT ALL

Мне удалось очистить данные.

Теперь я хочу добавить несколько фиктивных данных.

Допустим, у нас есть 3 таблицы: Country, Address и Country_Address (ссылка на страну).

Я добавил данные в Country и Address

Но когда я пытаюсь добавить к Country_Address:


Строка не обновлена.

Данные в строке 1 не были зафиксированы. Источник ошибки: поставщик данных .Net SqlClient. Сообщение об ошибке: оператор INSERT конфликтует с ограничением FOREIGN KEY


Я не совсем уверен, почему это происходит, потому что все, что я делаю, это связываю недавно добавленную страну и адреса - которые оба существуют - так почему это противоречит ограничению FK?

Из поиска в Google намекнул, что для исправления ситуации может потребоваться повторное заполнение таблиц. Во-первых, я не уверен на 100%, что означает повторное заполнение, я предполагаю, что речь идет о сбросе столбца с автоматически сгенерированным идентификатором.

Я заметил, что при добавлении новых записей в Country или Address они используют int, увеличенное с последней записи (которая теперь отсутствует), например, начать с идентификатора 400

Как я могу добавить данные в?

Ответы [ 4 ]

1 голос
/ 01 декабря 2010

Если вы собираетесь очистить все таблицы, я считаю, что проще всего написать сценарий структуры базы данных (вы сделали это и поместили ее в систему управления версиями, верно?), А затем отбросить базу данных и заново ее преобразовать. Затем запустите скрипт, чтобы добавить фиктивные данные.

1 голос
/ 01 декабря 2010

Повторное заполнение означает сброс идентификаторов с автоматическим увеличением для первичных ключей. Вы можете повторно заполнить таблицу SQL Server через Management Studio или с помощью операторов DDL. Пример * +1003 *

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

1 голос
/ 01 декабря 2010

Похоже, у вас есть столбец идентификатора в таблицах Страна и Адрес, а значения в Country_Address являются значениями идентификатора, которые ссылаются на две другие таблицы.И, похоже, у вас уже есть данные для Country_Address, которые имеют исходные значения для ссылочных данных.

Итак, повторное заполнение может быть решением.Я предполагаю, что ваши таблицы выглядят примерно так.

Country
-------
CountryID int identity(1, 1)
Country varchar(100)

Address
-------
AddressID int identity(1, 1)
Address varchar(100)
City varchar(100)

Не имеет значения, какие столбцы существуют для повторного заполнения, за исключением столбцов CountryID и AddressID в каждой таблице.Свойство identity(1, 1) указывает на то, что автонумерация начинается с 1 и увеличивается на 1. Таким образом, чтобы повторно заполнить таблицы Страна и Адрес, перед добавлением данных в таблицы Страна и Адрес можно сделать следующее:

DBCC CHECKIDENT ('Country', RESEED, 1)
DBCC CHECKIDENT ('Address', RESEED, 1)

Этовероятно, нет необходимости запускать команду для Country_Address, если только у нее нет столбца со свойством identity.

0 голосов
/ 01 декабря 2010

Попробуйте обрезать таблицы TRUNCATE TABLE table_name и затем снова вставить данные.

...