Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2008.05.04;
Скачать: [xml.tar.bz2];

Вниз

одновременное изменение первичного и внешнего ключей   Найти похожие ветки 

 
zorik ©   (2007-12-03 10:21) [0]

Есть две таблици, связаные по primary - foreign key. Как составить запрос, чтоб изменить значение primary key в первой таблице и значение foreign key во второй. И возможно ли такое без отключения constraints. В литературе наткнулся на cascade, но то ли это? К тому же синтаксиса не нашел


 
Sergey13 ©   (2007-12-03 10:29) [1]

Вообще то если в констрейнте прописано каскадное обновление, все должно само смениться при замене первичного ключа.
Но сама нужда редактирования ПК уже сильный звоночек про неправильное проектирование, если конечно это не разовая какая то работа.


 
zorik ©   (2007-12-03 10:38) [2]

В констрейнте каскаде не прописано, база не моя, немножко кривая. Смысл обновления в переходе с автоинкрементних ключей на псевдоавтоинкрементные (типа спецкод*1000 + значение генератора). Работа разовая, конечно. Пока вижу 2 выхода:
1. Убить констреинт и изменить значения в двух таблицах. Потом заново создать его
2. Пересоздать констреинт с параметром каскаде. И изменить значения


 
Sergey13 ©   (2007-12-03 10:44) [3]

> [2] zorik ©   (03.12.07 10:38)
> В констрейнте каскаде не прописано

Ну так пропиши и попробуй. Пробовать это желательно на копии БД.

> типа спецкод*1000 + значение генератора

Не маловато будет 1000 значений? Почему просто не сделать составной ПК из двух полей?


 
sniknik ©   (2007-12-03 10:55) [4]

> Смысл обновления в переходе с автоинкрементних ключей на псевдоавтоинкрементные (типа спецкод*1000 + значение генератора).
зря. имхо. один искуственный ключ менять на другой такой же, еще более искуственный...
или смысл в том что в ключ закладывается какаято инфа (типа спецкод), и он становится естественным? тем более зря, проще не шифровать эту инфу в коде, а писать ее в отдельное поле (и уж если нужен ключь именно по этой инфе то сделать его составным, вместе с автоинкрементом... хотя и это лишнее, автоинкремент самодостаточен в плане уникальности значений).


 
zorik ©   (2007-12-03 10:55) [5]


> Не маловато будет 1000 значений? Почему просто не сделать

это для примера 1000.

> составной ПК из двух полей?

что-то такое и будет.

всем спасибо


 
sniknik ©   (2007-12-03 10:57) [6]

+
в общем, не вижу смысла в "Смысле обновления ...", в любом варианте получается только хуже.


 
zorik ©   (2007-12-03 11:06) [7]

2
> sniknik ©   (03.12.07 10:57) [6]

нужно разделить базу по предприятиям. Их 5 штук. Сейчас все вместе. И предвидеть и реализовать возможность слития в одну базу. "Слитие" будет проходить примерно раз в месяц. Так вот, если использовать такой механизм, то сливать все в кучу можно будет с меньшими траблами -- не будет одинаковых ключей


 
Desdechado ©   (2007-12-03 11:27) [8]

Так добавь поле "код предприятия" и включи его в составной первичный ключ.
Всякие формульные ключи слишком геморройны в поддержании, особенно если нужно учесть справочник предприятий в виде таблицы с возможностью внешних ключей на нее.
А то у тебя сейчас получается ничуть не лучше

> база не моя, немножко кривая


 
zorik ©   (2007-12-03 12:02) [9]


> Так добавь поле "код предприятия" и включи его в составной
> первичный ключ.

протестировал что-то вроде:

CREATE TABLE TESTMAIN (
 ID   INTEGER NOT NULL,
 NAME VARCHAR(10)
);

ALTER TABLE TESTMAIN ADD CONSTRAINT
PK_MAIN
PRIMARY KEY (ID);

CREATE TABLE TESTCHILD (
 ID      INTEGER NOT NULL,
 ID_MAIN INTEGER NOT NULL,
 NAME    VARCHAR(10)
);

ALTER TABLE TESTCHILD ADD CONSTRAINT
PK_CHILD
PRIMARY KEY (ID, ID_MAIN);

ALTER TABLE TESTCHILD ADD CONSTRAINT
FK_CHILD_MAIN
FOREIGN KEY (ID_MAIN) REFERENCES TESTMAIN (ID);


Вроде работает :)


 
sniknik ©   (2007-12-03 12:31) [10]

> Так добавь поле "код предприятия" и включи его в составной первичный ключ.
имхо, и этого не надо...
автоинкремент в качестве исскуственного ключа самое то, за редкими исключениями...
в базе для связок нужен именно он, неужели при объединении баз из разных предприятий сложно добавлять так чтобы он перерассчитывался?

единственное назначение ключа это служить уникальным идентификатором записи. если же в ключ начинают добавлять значения из записи, это источник проблем еще больших чем "возможность сваливать все в куче с меньшими траблами"
ну вот допустим номер предприятия поменялся, чем это грозит общей базе? или на предприятиях не разобрались, и дали один номер двум... после спохватились и изменили на правильный (со всеми ключами естественно т.к. значение в связке)... и все, то что залито раньше нет возможности разделить. т.е. любое изменение значение повлечет за собой переделку всех связок где ключ участвует (и не в одной базе)...
было бы еще понятно будь этот номер естественным ключом записи (но тогда автоинкремент лишний).

хотя ладно, имхо все, а то счас очередной холивар естественный vs искуственный ключ начнется.


 
Desdechado ©   (2007-12-03 12:46) [11]

sniknik ©   (03.12.07 12:31) [10]
Имхо, ты запутался. Слишком много "если".


 
Johnmen ©   (2007-12-03 12:51) [12]


> zorik ©   (03.12.07 12:02) [9]

Это про что-то другое ты наваял.


 
Petr V. Abramov ©   (2007-12-03 12:52) [13]

> sniknik ©   (03.12.07 12:31) [10]
иногда подход автора имеет смысл, может, на этом ключе сто таблиц висит, и совершенно неохота допполе тянуть по всем ним


 
zorik ©   (2007-12-03 12:55) [14]

упс, вариант zorik ©   (03.12.07 12:02) [9] не пройдет. нельзя сослатся на таблицу testchild.
Представте несколько баз типа:
Предприятие(ключ) -> Месторождение(ключ_предприятия, ключ) -> Скважина(ключ_месторождения, ключ) -> Замеры(ключ_скважини, ключ)
Они заполняются на разных предприятиях независимо. Потом надо все это сливать в одно. Разными будут только ключи предприятия, остальные могут совпадать. При слитии надо будет использовать генераторы "главной" базы для получения значений ключей. Такой вариант тоже имеет право на жизнь. Но не знаю как легче реализовать. В любом случее будет гемор


 
sniknik ©   (2007-12-03 13:12) [15]

> и совершенно неохота допполе тянуть по всем ним
я то как раз не предлагаю "тянуть", это при включении в ключ номера предприятия произойдет.
я предлагал не делать гибриды из искуственных и естественных ключей, не хватает автоинкремента для "уникализации" записи, введите вместо него гуид, а номер предприятия оставьте там где ему место, в записи описывающей это предприятие (и тоже не ключем, номер меняется временами...).


 
Sergey13 ©   (2007-12-03 13:28) [16]

> [14] zorik ©   (03.12.07 12:55)

Прикинь примерное количество записей в проблемных таблицах за несколько лет эксплуатации. Возможно достаточно будет просто выделить диапазон ИД-шников. Вообще ничего менять не надо.


 
zorik ©   (2007-12-03 14:07) [17]

Набрался кучу полезностей, вариантов, мнений, технологий. Пошел переваривать :)))



Страницы: 1 вся ветка

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

Наверх





Память: 0.49 MB
Время: 0.009 c
2-1207681325
Ri2008
2008-04-08 23:02
2008.05.04
WM_POWERBROADCAST


15-1206068170
Study
2008-03-21 05:56
2008.05.04
Помогите поправить компонент


15-1205784808
{RASkov}
2008-03-17 23:13
2008.05.04
NoteBook и WinXP


10-1144210627
alk
2006-04-05 08:17
2008.05.04
Сохранение изменений на сервере


15-1205936204
Игорь Шевченко
2008-03-19 17:16
2008.05.04
Новости CodeGear from Borland, 1-й квартал 2008 года





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский