Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Внутренняя реляция в таблице / 8 сообщений из 8, страница 1 из 1
12.05.2017, 17:32
    #39452261
Mikhail Tchervonenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внутренняя реляция в таблице
Доброе время суток,
FB 3.0.2
есть таблица

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
SET SQL DIALECT 3;



/******************************************************************************/
/****                                Tables                                ****/
/******************************************************************************/


CREATE GENERATOR GEN_D_ID;

CREATE TABLE DICTIONARY (
    D_ID           DMN_INT_NOT_NULL NOT NULL /* DMN_INT_NOT_NULL = INTEGER NOT NULL */,
    D_MAIN_TYPE    DMN_VCHAR_3_NULL /* DMN_VCHAR_3_NULL = VARCHAR(3) */,
    D_TYPE         DMN_VCHAR_3_NOT_NULL NOT NULL /* DMN_VCHAR_3_NOT_NULL = VARCHAR(3) NOT NULL */,
    LANG           DMN_VCHAR_3_NOT_NULL NOT NULL /* DMN_VCHAR_3_NOT_NULL = VARCHAR(3) NOT NULL */,
    NAME           DMN_VCHAR_100_NOT_NULL NOT NULL /* DMN_VCHAR_100_NOT_NULL = VARCHAR(100) NOT NULL */,
    SORT_ID        DMN_INT_NULL /* DMN_INT_NULL = INTEGER */,
    SEL_ID_INT     DMN_INT_NULL /* DMN_INT_NULL = INTEGER */,
    SEL_ID_CHAR_3  DMN_VCHAR_3_NULL /* DMN_VCHAR_3_NULL = VARCHAR(3) */,
    SYSTEM         DMN_VCHAR_1_NOT_NULL DEFAULT 0 /* DMN_VCHAR_1_NOT_NULL = VARCHAR(1) */,
    MORE           DMN_VCHAR_500_NULL /* DMN_VCHAR_500_NULL = VARCHAR(500) */
);




/******************************************************************************/
/****                             Primary keys                             ****/
/******************************************************************************/

ALTER TABLE DICTIONARY ADD CONSTRAINT PK_DICTIONARY PRIMARY KEY (D_ID);


/******************************************************************************/
/****                               Indices                                ****/
/******************************************************************************/

CREATE UNIQUE INDEX IDX_DICTIONARY_TYP_LNG_NAM ON DICTIONARY (D_TYPE, LANG, NAME);
CREATE INDEX IDX_DICTIONARY_MAI_LNG_NAM ON DICTIONARY (D_MAIN_TYPE, LANG, NAME);
CREATE INDEX IDX_DICTIONARY_TYP_LNG_SRT ON DICTIONARY (D_TYPE, LANG, SORT_ID);


/******************************************************************************/
/****                               Triggers                               ****/
/******************************************************************************/



SET TERM ^ ;



/******************************************************************************/
/****                         Triggers for tables                          ****/
/******************************************************************************/



/* Trigger: DICTIONARY_BI */
CREATE OR ALTER TRIGGER DICTIONARY_BI FOR DICTIONARY
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
if ((NEW.D_ID is NULL) OR (NEW.D_ID < 1)) then NEW.D_ID = GEN_ID(GEN_D_ID, 1);
END
^



попытка создать внутренний FOREIGN KEYS:
Код: sql
1.
2.
ALTER TABLE "DICTIONARY" ADD CONSTRAINT FK_DICT_TYP_LAN_NAM FOREIGN KEY (D_MAIN_TYPE,LANG,NAME)
     REFERENCES DICTIONARY (D_TYPE,LANG,NAME) ON DELETE CASCADE ON UPDATE CASCADE


приводит к ошибке:
FB3.0.2This operation is not defined for system tables.
unsuccessful metadata update.
ALTER TABLE DICTIONARY failed.
could not find UNIQUE or PRIMARY KEY constraint in table DICTIONARY with specified columns.
хотя уникальный ключ есть:
Код: sql
1.
CREATE UNIQUE INDEX IDX_DICTIONARY_TYP_LNG_NAM ON DICTIONARY (D_TYPE, LANG, NAME);


в связи с этим вопрос, как создать внутреннюю реляцию по полям с D_MAIN_TYPE, LANG, NAME на поля D_TYPE, LANG, NAME внутри одной таблицы?

В MsSQL такое вроде прокатывало.
Спасибо.
...
Рейтинг: 0 / 0
12.05.2017, 17:41
    #39452269
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внутренняя реляция в таблице
Hello, Mikhail Tchervonenko!

тебе нужно было создать CONSTRAINT UNIQUE,
а ты вместо этого создал UNIQUE INDEX.
это разные вещи. об чём сервер тебе и говорит.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
12.05.2017, 17:42
    #39452271
Mikhail Tchervonenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внутренняя реляция в таблице
Мимопроходящий,

спасиб, точно!
...
Рейтинг: 0 / 0
12.05.2017, 17:42
    #39452273
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внутренняя реляция в таблице
Дерево по трем полям?
...
Рейтинг: 0 / 0
12.05.2017, 17:45
    #39452278
Mikhail Tchervonenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внутренняя реляция в таблице
wadmanДерево по трем полям?
типа того, но это упрощённый вариант
...
Рейтинг: 0 / 0
12.05.2017, 18:33
    #39452307
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внутренняя реляция в таблице
В один день 2 одинаковых топика. Забавно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
12.05.2017, 19:21
    #39452338
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внутренняя реляция в таблице
Mikhail Tchervonenko,

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

Да, и дерево по трем полям - это изврат.
...
Рейтинг: 0 / 0
12.05.2017, 19:55
    #39452358
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внутренняя реляция в таблице
Mikhail Tchervonenko,

в общем, примерно так:
- либо в этой таблице не должно быть D_ID, а те три поля должны быть ПК, либо
- если построить АЛЬТЕРНАТИВНЫЙ ключ (т.е. уникальный констрейнт, а не индекс) по столбцам D_TYPE,LANG,NAME, то значит, что одна запись с комбинацией таких полей будет соответствовать одному D_ID. Следовательно, смысловое значение этих столбцов можно приравнять, и для дерева использовать D_ID и какой-нибудь D_PARENT_ID.
Правда, назначение D_MAIN_TYPE от меня ускользает. Или это как раз и есть эта самая попытка сделать дерево одним столбцом, а не тремя?
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Внутренняя реляция в таблице / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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