Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 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
Спасибо за участие и помощь. Буду разбираться. :)




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




Наверх





Память: 0.74 MB
Время: 0.056 c
3-43              YVaschuk              2002-03-06 13:36  2002.04.01  
SQL Query в связанных таблицах


3-22              Dimonka               2002-03-06 10:39  2002.04.01  
Ошибка в запросе!


1-224             Алена                 2002-03-20 10:05  2002.04.01  
свойство типа TCollection


3-2               Yakudza               2002-03-05 13:27  2002.04.01  
Invalid BLOB handle in record buffer


14-288            Knight                2002-02-12 18:05  2002.04.01  
Прогу исчу... Не подскажете наилучшейшую?