Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как изменять только часть FOREIGN KEY?
|
|||
|---|---|---|---|
|
#18+
имеем 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, но это если ничего другого нельзя... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2006, 12:39 |
|
||
|
Как изменять только часть FOREIGN KEY?
|
|||
|---|---|---|---|
|
#18+
Пора бы уже подумать об изменении структуры БД, если возникают такие вопросы... Поскольку t_X1.id_x1 у вас объявлено как NOT NULL, а на t_X2.id_x1 висит внешний ключ - то t_X2.id_X1 не может содержать значений, не содержащихся в t_X1.id_X1 Попытка вставить туда NULL является нарушением идеологиии внешнего ключа. ===================================== Страну, в которой все ходят на бровях, на колени не поставишь... ===================================== ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 14:05 |
|
||
|
Как изменять только часть FOREIGN KEY?
|
|||
|---|---|---|---|
|
#18+
Почему является нарушением идеологии? Не вижу здесь никакой неоднозначности... Объясните. FOREIGN KEY для меня должен четко определять есть связанная запись или нет. По поводу структуры базы... Ну давайте подумаем вместе. Я лично не вижу другого варианта. Смотрите что у меня есть: Поле id_store является обязательным для ВСЕХ таблиц в моей базе, и является идентификатором магазина. (база является хранилищем данных кучи магазинов). Каждый магазин имеет аналогичные таблицы, но без поля id_store. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 15:19 |
|
||
|
Как изменять только часть FOREIGN KEY?
|
|||
|---|---|---|---|
|
#18+
Протупил, посмотрел не туда :-( Похоже, что в вашем случае решением будет именно триггер. Ибо в данном случае SET NULL будет работать для всех значений, включенных в первичный ключ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 18:24 |
|
||
|
Как изменять только часть FOREIGN KEY?
|
|||
|---|---|---|---|
|
#18+
А вообще говоря, можно ли считать составной первичный ключ, у которого изменилась одна часть, тем же самым? Я бы вообще отказался в такой таблице от ПК ===================================== Страну, в которой все ходят на бровях, на колени не поставишь... ===================================== ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2006, 18:34 |
|
||
|
Как изменять только часть FOREIGN KEY?
|
|||
|---|---|---|---|
|
#18+
Как вариант: сделать нумерацию id_x1 сквозной для всех магазинов (использовать sequence), из t_X2 убрать поле id_store, и сделать связь только по полю id_x1. Впрочем, может я фигню предлагаю? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2006, 08:19 |
|
||
|
Как изменять только часть FOREIGN KEY?
|
|||
|---|---|---|---|
|
#18+
Кувалдин РоманА вообще говоря, можно ли считать составной первичный ключ, у которого изменилась одна часть, тем же самым? Извиняюсь, я пример неудачный привел. В реале дополнительное поле в 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, ); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2006, 10:39 |
|
||
|
Как изменять только часть FOREIGN KEY?
|
|||
|---|---|---|---|
|
#18+
А может лучше вообще уйти от составных ключей? ввести отдельный праймари кей, в другой таблице ссылку на него а два поля ограничить по unique? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2006, 15:19 |
|
||
|
Как изменять только часть FOREIGN KEY?
|
|||
|---|---|---|---|
|
#18+
Сейчас у меня FOREIGN только для UPDATE используется, на удаление юзаю триггер. Через триггер, понятное дело, можно все сделать, но FOREIGN писать короче... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2006, 17:16 |
|
||
|
Как изменять только часть FOREIGN KEY?
|
|||
|---|---|---|---|
|
#18+
HordiСейчас у меня FOREIGN только для UPDATE используется, на удаление юзаю триггер. Через триггер, понятное дело, можно все сделать, но FOREIGN писать короче... смотрю такую же задачку. Т.ч. имею интерес. В т.ч. к триггерам ЗЫ Делал ли разделение прав по id_store? (т.е. "позаписно") Если да, то как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2006, 11:03 |
|
||
|
|

start [/forum/topic.php?desktop=1&fid=53&tid=2005834]: |
0ms |
get settings: |
6ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
32ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
25ms |
get tp. blocked users: |
1ms |
| others: | 233ms |
| total: | 318ms |

| 0 / 0 |
