Форум: "Базы";
Текущий архив: 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