powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как изменять только часть FOREIGN KEY?
10 сообщений из 10, страница 1 из 1
Как изменять только часть FOREIGN KEY?
    #34046871
Hordi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
имеем 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
Как изменять только часть FOREIGN KEY?
    #34050530
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пора бы уже подумать об изменении структуры БД, если возникают такие вопросы...

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


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

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



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

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

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


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

Извиняюсь, я пример неудачный привел. В реале дополнительное поле в 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
Как изменять только часть FOREIGN KEY?
    #34053998
Jelis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А может лучше вообще уйти от составных ключей? ввести отдельный праймари кей, в другой таблице ссылку на него а два поля ограничить по unique?
...
Рейтинг: 0 / 0
Как изменять только часть FOREIGN KEY?
    #34054415
Hordi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сейчас у меня FOREIGN только для UPDATE используется, на удаление юзаю триггер. Через триггер, понятное дело, можно все сделать, но FOREIGN писать короче...
...
Рейтинг: 0 / 0
Как изменять только часть FOREIGN KEY?
    #34232210
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HordiСейчас у меня FOREIGN только для UPDATE используется, на удаление юзаю триггер. Через триггер, понятное дело, можно все сделать, но FOREIGN писать короче...
смотрю такую же задачку. Т.ч. имею интерес. В т.ч. к триггерам

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


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