составной ключ и как его едят

Модераторы: kdv, CyberMax

Ответить
Attid
Спец
Сообщения: 377
Зарегистрирован: 14 ноя 2006, 09:58

составной ключ и как его едят

Сообщение Attid » 27 ноя 2007, 20:47

жил не тужил но понадобилось реплику сделать
почему мне захотелось двойной ключ сделать,
1 типа для отчетности потом проще , чем писать больше\меньше 10000000
2 филиалы являются выездными (сегодня выехали, через месяц вернулись потом заново но отчетность с нуля)


берем табличку

Код: Выделить всё

CREATE TABLE BILLS (
    ID      DM_ID /* DM_ID = INTEGER NOT NULL */,
    FID     DM_ID NOT NULL /* DM_ID = INTEGER NOT NULL */,
/**cut**/
ALTER TABLE BILLS ADD CONSTRAINT PK_BILLS PRIMARY KEY (ID, FID);
вроде все хорошо, берем вторую табличку

Код: Выделить всё

CREATE TABLE BILL_PAY (
    ID         DM_ID NOT NULL /* DM_ID = INTEGER NOT NULL */,
    FID        DM_ID /* DM_ID = INTEGER NOT NULL */,
    ID_BILL    DM_ID /* DM_ID = INTEGER NOT NULL */,
/**cut**/
ALTER TABLE BILL_PAY ADD CONSTRAINT PK_BILL_PAY PRIMARY KEY (ID, FID);
добавляю внешний ключ

Код: Выделить всё

ALTER TABLE BILL_PAY ADD CONSTRAINT FK_BILL_PAY_1 FOREIGN KEY (ID_BILL, FID) REFERENCES BILLS (ID, FID);
меня терзают смутные сомнения а не будет ли у него непоняток какое поле на какое ссылается ?

если я его обьявлю вот так:

Код: Выделить всё

ALTER TABLE BILL_PAY ADD CONSTRAINT FK_BILL_PAY_1 FOREIGN KEY (FID, ID_BILL) REFERENCES BILLS (ID, FID);
будет ли это уже другой ключ или связка

Код: Выделить всё

ID_BILL, FID
1,5
5,1
является для него одинаковой или разной ? =/

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 28 ноя 2007, 02:15

если ты думаешь что сервер совсем тупой - возьми да проверь. быстрее бы проверил, чем то сообщение писал.

Attid
Спец
Сообщения: 377
Зарегистрирован: 14 ноя 2006, 09:58

Сообщение Attid » 28 ноя 2007, 10:47

ну я как бы паролельно делал, просто сомневаться стал.сервер то конечно умный, он же железный =)

просмотрел
LANGREF.PDF
ib60releasenotes.pdf
Firebird_v1.5.3.ReleaseNotes.pdf
Firebird_v2.0.0.ReleaseNotes.pdf
ничего по этому поводу не нашел, в нете тоже как-то не густо, поэтому хочу ответов на свои вопросы.

Код: Выделить всё

ALTER TABLE BILL_PAY ADD CONSTRAINT FK_BILL_PAY_1 FOREIGN KEY (FID, ID_BILL) REFERENCES BILLS (ID, FID);
ALTER TABLE BILL_PAY ADD CONSTRAINT FK_BILL_PAY_1 FOREIGN KEY (ID_BILL, FID) REFERENCES BILLS (ID, FID);
я пробывал на базе с данным, эксепшен не дало не то не другое значит ему поравно на поля при обьявлении, соответственно интересно как оно все работает. вернее определяет какой ключ куда относится, внешний ключ это же тригер работающий вне транзакции, и у него должен быть алгоритм =)

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 28 ноя 2007, 10:54

внешний ключ это же тригер работающий вне транзакции
FK по умолчанию - это просто индекс. доп. системные триггерные фишки это при каскадах всяких.

Attid
Спец
Сообщения: 377
Зарегистрирован: 14 ноя 2006, 09:58

Сообщение Attid » 28 ноя 2007, 19:34

я так не играю =(
на какую-то муторную тему про мастер детайл ответов больше чем тут =(
пойду кроспостить

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 28 ноя 2007, 20:48

Материться здесь не принято, а по-другому отреагировать на вопрос про последовательность сегментов в ключе не получается. Дальше, естественно, четать не стал.

Attid
Спец
Сообщения: 377
Зарегистрирован: 14 ноя 2006, 09:58

Сообщение Attid » 28 ноя 2007, 21:29

а отреагировать на перечисление документов в которых я ничего не нашел, посредством тыканья носом где это написано ?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 28 ноя 2007, 22:59

посредством тыканья носом где это написано
написано ЧТО?
берем простой двухсегментный ПК, со столбцами А и Б.
В А пишем 1, в Б - 5. Добавляем вторую запись - Б = 1, А = 5.
Нарушение уникальности ПК есть? Нет.
теперь создадим FK с другой таблицы на этот ПК. Создадим ОДНУ запись в таблице с ПК А = 1 и Б = 5, потом попробуем создать в таблице с ФК запись со значениями наоборот - А = 5 и Б = 1. Проходит?
а отреагировать на перечисление документов
да ты фигню какую-то пишешь и спрашиваешь, извини за выражение. что за проблема, которую ты проверить не в состоянии?
я пробывал на базе с данным, эксепшен не дало не то не другое значит ему поравно на поля при обьявлении
ДА. РАЗУМЕЕТСЯ. В ФК порядок следования столбцов необязательно должен совпадать с порядком в ПК. Это нигде не написано потому что это ОЧЕВИДНО. Тем кто знаком с проектированием БД :-)
меня терзают смутные сомнения а не будет ли у него непоняток какое поле на какое ссылается
если у тебя возникает такой вопрос, то вопрос этот не о порядке столбцов в ФК, а о ЗНАЧЕНИЯХ в ФК. См выше мой пример.

Attid
Спец
Сообщения: 377
Зарегистрирован: 14 ноя 2006, 09:58

Сообщение Attid » 29 ноя 2007, 00:44

вот теперь кажется начинаю понимать =)
на самом деле ссылка идет не на эти два ключа, а на уникальный индекс образованный эти полями , соответственно хоть я и пишу что

Код: Выделить всё

ALTER TABLE BILL_PAY ADD CONSTRAINT FK_BILL_PAY_1 FOREIGN KEY (FID, ID_BILL) REFERENCES BILLS (ID, FID);
физически получается что-то вроде

Код: Выделить всё

ALTER TABLE BILL_PAY ADD CONSTRAINT FK_BILL_PAY_1 FOREIGN KEY ВНОВЬ_ОБРАЗОВАНЫЙ_ИНДЕКС_FID_И_ID_BILL REFERENCES BILLS НА_ИНДЕКС_ОБРАЗОВАНЫЙ_FID_И_ID;
теперь правильно ?


хотя вот это все рано не очень понимаю
берем простой двухсегментный ПК, со столбцами А и Б.
В А пишем 1, в Б - 5. Добавляем вторую запись - Б = 1, А = 5.
Нарушение уникальности ПК есть? Нет.
теперь создадим FK с другой таблицы на этот ПК. Создадим ОДНУ запись в таблице с ПК А = 1 и Б = 5,
потом попробуем создать в таблице с ФК запись со значениями наоборот - А = 5 и Б = 1. Проходит?
имеем таблицу1
ИД это данные составной ключ АБ

Код: Выделить всё

ИД  А  Б
 1   1  5
 2   5  1
имеем таблицу2
ИД это ключ
внешний ключ ГЕ

Код: Выделить всё

ИД  Г  Е
 8   1  5
наружения целостности нету
и удалить я смогу только 2 5 1

и все таки получается что вот это разные внешнии ключи:

Код: Выделить всё

ALTER TABLE BILL_PAY ADD CONSTRAINT FK_BILL_PAY_1 FOREIGN KEY (FID, ID_BILL) REFERENCES BILLS (ID, FID);
ALTER TABLE BILL_PAY ADD CONSTRAINT FK_BILL_PAY_1 FOREIGN KEY (ID_BILL, FID) REFERENCES BILLS (ID, FID);
а вот это просто даст эксепшен.

Код: Выделить всё

ALTER TABLE BILL_PAY ADD CONSTRAINT FK_BILL_PAY_1 FOREIGN KEY (FID, ID_BILL) REFERENCES BILLS (FID, ID);
а на опытах я то проверял но что-то эксепшена не получил на таблицах с данными, картина мироздания вроде нарисовалась, осталось второй вопрос решить, но он уже на другом форуме =)

Ответить