Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2002.04.01;
Скачать: [xml.tar.bz2];

Вниз

deadlock violation при удалении записей   Найти похожие ветки 

 
ЛенаК   (2002-03-06 09:36) [0]

Есть две таблицы:
CREATE TABLE PROFILE
(
PROFILE_ID SMALLINT NOT NULL,
PARITY SMALLINT NOT NULL,
PROFILE_NAME VARCHAR(15),
PRIMARY KEY (PROFILE_ID)
);
CREATE TABLE OTMETKI
(
PROFILE_ID SMALLINT NOT NULL,
PIKET NUMERIC(15, 2),
OTMETKA NUMERIC(15, 2),
HEIGHT_KAMERA NUMERIC(15, 2)
);
ALTER TABLE OTMETKI ADD FOREIGN KEY (PROFILE_ID) REFERENCES PROFILE (PROFILE_ID);
Пытаюсь удалить записи из таблицы OTMETKI при помощи следующей ХП:
ALTER PROCEDURE DELETE_OTMETKI
(
PROF INTEGER
)
AS
begin
delete from otmetki where profile_id=:prof;
suspend;
end
где PROF - PROFILE_ID из таблицы PROFILE.
Выдаёт ошибку "deadlock violation of FOREIGN KEY constraint "INTEG_19" on table OTMETKI".
Понимаю только, что дело во внешнем ключе :)
Подскажите, пожалуйста, в чём я не права?
Спасибо.


 
roottim   (2002-03-06 11:04) [1]

а без ФК идет?
в пр нет ничего такого...
и может попробовать integer параметр сменить на smallint, хотя это непренципиально!!... хотя что-то в этом ограничение "INTEG_19" есть!
а в ИБ параметры с двоеточием пишутся?.. я просто незнаю... в оракле без них...


 
ЛенаК   (2002-03-06 11:57) [2]

Так вот не хотелось бы убирать FK! Тут как раз в нём причина, мне кажется. А без FK работает.


 
Romkin   (2002-03-06 12:50) [3]

Ну естественно, FK просто запрещает удалить мастер-запись при наличии связанных с ней.
Выход:
1. ALTER TABLE OTMETKI ADD FOREIGN KEY (PROFILE_ID) REFERENCES PROFILE (PROFILE_ID) ON DELETE CASCADE ON UPDATE CASCADE
2. Скорее всего наличествует такой же ключ, ссылающийся на OTMETKI
Посмотреть можно, выведя метаданные таблицы - что такое INTEG_19,
а лучше все метаданные базы
Для разбора лучше именовать constraints:
ALTER TABLE OTMETKI ADD CONSTRAINT <Name> FOREIGN KEY ...


 
roottim   (2002-03-06 13:39) [4]

я так понял удаляется то не мастер а наоборот! или я не прав!
а CASCADE это детали..... для мастера


 
Romkin   (2002-03-06 14:01) [5]

Здесь скорее всего закольцовка FOREIGN KEY - таблицы ссылаются друг на друга вкруговую


 
ЛенаК   (2002-03-06 14:23) [6]

Нет, они не закольцованы - roottim прав - удаляю из детайл таблицы (OTMETKI), в которой установлен FK к таблице PROFILE (PROFILE_ID).Т.е. смысл в том, что удаляю записи из OTMETKI, а мастер-запись в PROFILE остаётся.
>Romkin - а как мне теперь определение
ALTER TABLE OTMETKI ADD FOREIGN KEY (PROFILE_ID) REFERENCES PROFILE (PROFILE_ID) изменить?
Вроде бы через ALTER TABLE OTMETKI DROP constraint ... или как?
Не могу догадаться...


 
Romkin   (2002-03-06 14:33) [7]

ALTER TABLE OTMETKI DROP constraint INTEG_19 - скорее всего.
имя можно посмотреть на вкладке Metadata в свойствах таблицы в IBConsole - там все constraints перечислены.
И можно ли взглянуть на раздел Index definitions for all user tables в метаданных базы? Те строки, где add constraint FOREIGN KEY...


 
roottim   (2002-03-06 15:40) [8]

а если напрямую через утильку сделать
delete from otmetki where profile_id=123;
то тоже самое.


 
Romkin   (2002-03-06 16:28) [9]

А может все дело в том, что у OTMETKI нет первичного ключа?


 
ЛенаК   (2002-03-07 06:32) [10]

Да, у OTMETKI нет первичного ключа, но разве он обязательно должен быть? По логике работы, он, вроде бы, ни к чему.
constraints у меня вообще в базе пока нет никаких - ни в свойствах таблицы, ни в метаданных базы. И раздела Index definitions for all user tables у меня тоже нет. Может, убрать этот FK - сделала его на автопилоте, может и без него будет всё работать?
Попробовала самый простой вариант - взяла
IBTable1-OTMETKI с FK и попыталась вставить туда записи из обычным append-post. Выдаётся почти такая же ошибка "violation on FK constraint INTEG_30 on table OTMETKI".


 
Romkin   (2002-03-07 11:42) [11]

Constraints есть - по крайней мере FOREIGN KEY на OTMETKI с именем INTEG_30.
А данная ошибка скорее всего из-за того, что вставлялось значение OTMETKI.PROFILE_ID, которого нет в PROFILE.PROFILE_ID
Первичные ключи рекомендую создавать для всех таблиц, они всегда весьма желательны
Единственный довод против Foreign keys - на каждый ключ создается индекс, в данном случае по полю OTMETKI.PROFILE_ID (для ускорения проверки). Если это нежелательно, целостность все равно должна быть обеспечена, через триггеры, например.
Скрипт ЛенаК (06.03.02 09:36) у меня на IB6.0.1 проходит полностью, без ошибок при выполнении sp
Так что действительно должен быть FOREIGN KEY, который конфликтует с указанным
Список всех constraints можно посмотреть в таблицах rdb$relation_constraints & rdb$ref_constraints (foreign keys)


 
ЛенаК   (2002-03-07 12:38) [12]

>Romkin
Спасибо за участие и помощь. Буду разбираться. :)



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2002.04.01;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.005 c
3-54
Malder
2002-03-06 16:58
2002.04.01
Ошибка при query1.edit;


1-102
Толик
2002-03-17 22:15
2002.04.01
Глюки TCHART


1-236
SlavaLamer
2002-03-20 19:48
2002.04.01
Реестр


1-204
Сержжж
2002-03-20 10:49
2002.04.01
Выделение нескольких дат в MonthCalendar


1-184
Юрий Федоров
2002-03-19 18:03
2002.04.01
Общее адресное пространство для двух процессов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский