Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как изменять только часть FOREIGN KEY? / 10 сообщений из 10, страница 1 из 1
11.10.2006, 12:39
    #34046871
Hordi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменять только часть FOREIGN KEY?
имеем 2 таблицы:

create table t_X1(
id_store INT NOT NULL,
id_x1 INT NOT NULL,
PRIMARY KEY(id_store,id_x1)
);

create table t_X2(
id_store INT NOT NULL,
id_x1 INT,
PRIMARY KEY(id_store,id_x1),
FOREIGN KEY (id_store,id_x1)REFERENCES t_X1 (id_store,id_x1) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE SET NULL,
);

INSERT INTO t_X1 VALUES(1,1);
INSERT INTO t_X2 VALUES(1,1);

--DELETE FROM t_X1;
Запрос об удалении из первой таблицы не работает, т.к. происходит попытка установить в NULL id_store в t_X2.

Очень хочется сделать такую штуку, чтобы SET NULL делался только на одно поле таблицы t_X2.id_x1.

Можно сделать такое, навесив триггер на t_X1, но это если ничего другого нельзя...
...
Рейтинг: 0 / 0
12.10.2006, 14:05
    #34050530
Кувалдин Роман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменять только часть FOREIGN KEY?
Пора бы уже подумать об изменении структуры БД, если возникают такие вопросы...

Поскольку t_X1.id_x1 у вас объявлено как NOT NULL, а на t_X2.id_x1 висит внешний ключ - то t_X2.id_X1 не может содержать значений, не содержащихся в t_X1.id_X1 Попытка вставить туда NULL является нарушением идеологиии внешнего ключа.


=====================================
Страну, в которой все ходят на бровях,
на колени не поставишь...
=====================================
...
Рейтинг: 0 / 0
12.10.2006, 15:19
    #34050903
Hordi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменять только часть FOREIGN KEY?
Почему является нарушением идеологии? Не вижу здесь никакой неоднозначности... Объясните.

FOREIGN KEY для меня должен четко определять есть связанная запись или нет.



По поводу структуры базы... Ну давайте подумаем вместе. Я лично не вижу другого варианта. Смотрите что у меня есть:

Поле id_store является обязательным для ВСЕХ таблиц в моей базе, и является идентификатором магазина. (база является хранилищем данных кучи магазинов). Каждый магазин имеет аналогичные таблицы, но без поля id_store.
...
Рейтинг: 0 / 0
12.10.2006, 18:24
    #34051743
Кувалдин Роман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменять только часть FOREIGN KEY?
Протупил, посмотрел не туда :-(
Похоже, что в вашем случае решением будет именно триггер. Ибо в данном случае SET NULL будет работать для всех значений, включенных в первичный ключ.
...
Рейтинг: 0 / 0
12.10.2006, 18:34
    #34051773
Кувалдин Роман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменять только часть FOREIGN KEY?
А вообще говоря, можно ли считать составной первичный ключ, у которого изменилась одна часть, тем же самым?

Я бы вообще отказался в такой таблице от ПК


=====================================
Страну, в которой все ходят на бровях,
на колени не поставишь...
=====================================
...
Рейтинг: 0 / 0
13.10.2006, 08:19
    #34052375
Andrew Sagulin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменять только часть FOREIGN KEY?
Как вариант: сделать нумерацию id_x1 сквозной для всех магазинов (использовать sequence), из t_X2 убрать поле id_store, и сделать связь только по полю id_x1.
Впрочем, может я фигню предлагаю? :)
...
Рейтинг: 0 / 0
13.10.2006, 10:39
    #34052784
Hordi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменять только часть FOREIGN KEY?
Кувалдин РоманА вообще говоря, можно ли считать составной первичный ключ, у которого изменилась одна часть, тем же самым?

Извиняюсь, я пример неудачный привел. В реале дополнительное поле в primary key не включается.
Правильнее так:
create table t_X2(
id_store INT NOT NULL,
id_x2 INT NOT NULL,
id_x1 INT,
PRIMARY KEY(id_store,id_x2),
FOREIGN KEY (id_store,id_x1)REFERENCES t_X1 (id_store,id_x1) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE SET NULL,
);
...
Рейтинг: 0 / 0
13.10.2006, 15:19
    #34053998
Jelis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменять только часть FOREIGN KEY?
А может лучше вообще уйти от составных ключей? ввести отдельный праймари кей, в другой таблице ссылку на него а два поля ограничить по unique?
...
Рейтинг: 0 / 0
13.10.2006, 17:16
    #34054415
Hordi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменять только часть FOREIGN KEY?
Сейчас у меня FOREIGN только для UPDATE используется, на удаление юзаю триггер. Через триггер, понятное дело, можно все сделать, но FOREIGN писать короче...
...
Рейтинг: 0 / 0
29.12.2006, 11:03
    #34232210
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменять только часть FOREIGN KEY?
HordiСейчас у меня FOREIGN только для UPDATE используется, на удаление юзаю триггер. Через триггер, понятное дело, можно все сделать, но FOREIGN писать короче...
смотрю такую же задачку. Т.ч. имею интерес. В т.ч. к триггерам

ЗЫ Делал ли разделение прав по id_store? (т.е. "позаписно")
Если да, то как?
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как изменять только часть FOREIGN KEY? / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]