Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.11.2009, 17:55   #1
tools
Форумчанин
 
Регистрация: 07.10.2008
Сообщений: 213
Восклицание Ошибка инструкции Insert

Работаю в SQL server'е.
Описание проблемы:
Создаю две таблицы для своей БД (Собственник и фирма):

Первая таблица
Код:
CREATE TABLE SOBSTVENNIK
(nomer_SOBSTV INT check(nomer_SOBSTV>=0 AND nomer_SOBSTV<=999) PRIMARY KEY default 0,

FIO CHAR(50)CHECK((FIO>='А' AND FIO<='я') OR FIO='.' OR FIO='-')NOT NULL default 'инициалы не указаны');
Вторая
Код:
CREATE TABLE FIRMA
(FIRM_NUMBER INT CHECK(FIRM_NUMBER>=0 AND FIRM_NUMBER<=99) primary key default 0,

nazv_firm char(30) check ((nazv_firm>='А' and nazv_firm<='я') or (nazv_firm>='A' and nazv_firm<='z') or nazv_firm='-') not null default 'название не указано',

nomer_sobstv int check(nomer_SOBSTV>=0 AND nomer_SOBSTV<=999) not null default 0 foreign KEY references SOBSTVENNIK(nomer_sobstv));
Потом создаю представление для таблицы Фирма (c учетом того,что некоторые значения я уже ввел в таблицу, поэтому я и ставлю условие выбора номера собственника больше 3 ):

Код:
create view Firma_clone (nazvanie, nomer)
  as select nazv_firm, nomer_sobstv
    from firma
       where nomer_sobstv>3;
Далее я пытаюсь вставить следующую строчку

Код:
insert into Firma_clone 
values ('Название фирмы',1);
Т.е. тут я хочу проверить модифицируемость представления, когда строки, не удовлетворяющие условию
Код:
where nomer_sobstv>3
будут появляться только в таблице, а в представлении отображаться не будут. Но при попытке выполнения запроса получаю следующую ошибку

Код:
547, уровень 16, состояние 0, строка 1
Конфликт инструкции INSERT с ограничением FOREIGN KEY "FK__FIRMA__nomer_sob__08EA5793". Конфликт произошел в базе данных "Database_1", таблица "dbo.SOBSTVENNIK", column 'nomer_SOBSTV'.
Выполнение данной инструкции было прервано.
Так вот вопрос: почему возникает эта ошибка, если я поставил для всех полей значение default? Т.е. я рассчитывал на то,что после ввода строки
поле FIRM_NUMBER получит дефолтовое значение НОЛЬ, а остальные поля - те значения, которые я ввел с помощью Insert(т.е. 'Название фирмы' и 1(единичку) соответственно).
Если убрать внешние ключи, то все нормально вводится...
tools вне форума Ответить с цитированием
Старый 18.11.2009, 19:08   #2
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

странные у вас какие-то чеки прописаны и дефолты на праймари
раз уж праймари, то они и должны заполняться не по дефолту

а по проблеме: видимо, нет такой записи в табл. SOBSTVENNIK с полем nomer_SOBSTV = 1
soleil@mmc вне форума Ответить с цитированием
Старый 18.11.2009, 19:21   #3
tools
Форумчанин
 
Регистрация: 07.10.2008
Сообщений: 213
По умолчанию

я default для праймари поставил для случая, если бы у нас номера собственника не было в представлении,то при ставке строки, он бы значение null попытался бы всунуть туда, а так ноль поставит
А так его конечно нужно убрать, просто я забыл про него

Кстати, за ответ спасибо большое, действительно 1 не внес при заполнении, невнимательность подвела ....

Последний раз редактировалось tools; 18.11.2009 в 19:25.
tools вне форума Ответить с цитированием
Старый 18.11.2009, 21:32   #4
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

я говорил про это
Код:
 check(nomer_SOBSTV>=0 AND nomer_SOBSTV<=999)
не вижу ничего трагического в том, что это поле примет значение -100 или 1010
это же праймари
а чтобы оно гарантированно заполнялось нужно ставить ему NOT NULL
soleil@mmc вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
MMX инструкции , С++ и *.bmp gizmonder Общие вопросы C/C++ 0 14.11.2009 22:39
Почему после выполнения do-while, вложенного в if, инструкции дальше не выполняются? Chewing_dog Помощь студентам 3 09.06.2009 06:44
SQL: Insert и Delete в чем ошибка? FReeMAN(Q) Помощь студентам 2 17.04.2009 18:09
insert через table->grid: ошибка Geddar БД в Delphi 2 06.06.2008 13:43
Ошибка при Выполнении Insert nimf БД в Delphi 2 27.11.2007 18:16