2010-12-01 1 views
1

У меня есть БД SQL в MS SQL Server 2008 R2Работа с ограничениями FK - Слив и заправка SQL Server 2008 дб

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

После некоторой борьбы с FK Ограничениями, и используя

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

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

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

Допустим, у нас есть 3 стола, Country, Address и Country_Address (связующий адрес в стране).

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

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


строка не была обновлена.

Данные в строке 1 не были выполнены. Источник ошибки: .Net SqlClient Data Provider. Сообщение Error: INSERT заявление противоречит ограничению внешнего ключа


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

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

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

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

+1

Вы уверены, что вы добавляете * новые * идентификационные номера для страны и адреса? – thomaspaulb 2010-12-01 00:07:21

ответ

1

Похоже, что у вас есть столбец идентификатора в таблицах Страна и Адрес, а значения в 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, если у нее нет столбца с идентификационным свойством.

+0

Рецидирование действительно было решением. Усечение таблиц не сработало (при этом таблицы не перегружены) – baron 2010-12-02 05:58:40

1

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

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

0

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

1

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