Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Имя для Constraint / 4 сообщений из 4, страница 1 из 1
25.02.2009, 13:05
    #35836465
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имя для Constraint
Здравствуйте всем!
DB2 8.1.14
Есть таблица, которая создавалась примерным скриптом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
create table MYTAB
(
    FAM       varchar( 40 )  not null,
    NAM      varchar( 40 )  not null,
    PTR      varchar( 40 )  not null,
    SEX       character( 1 ) not null,
    BIRTHDAT  date         not null,
    BIRTHYEAR smallint     not null
)@

Я могу создать Check Constraint с именем для поля SEX
Код: plaintext
1.
ALTER TABLE MYTAB ADD CONSTRAINT MYTAB_CHK_SEX  CHECK (SEX in ('М','Ж'))@

Поле BIRTHYEAR у меня генерируемое -
Код: plaintext
alter table MYTAB alter column BIRTHYEAR set generated always as (CAST((YEAR(BIRTHDAT)) AS SYSIBM.SMALLINT))
Посмотрел в SYSCAT.Checks (производные таблицы) и увидел, что этому Constraint было присвоено произвольное имя SQL081226104408780 и выражение вида
Код: plaintext
"BIRTHYEAR" = CAST((YEAR(BIRTHDAT)) AS SYSIBM.SMALLINT)

Могу ли я создавать констрайнт для генерируемого поля с нужным мне именем? Или переименовать существующий?

С уважением, Семен Попов
...
Рейтинг: 0 / 0
25.02.2009, 15:32
    #35836921
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имя для Constraint
Вроде бы напрашивается
Код: plaintext
alter table MYTAB add constraint MYTAB_EXP_ALGYEAR  check ("BIRTHYEAR" = (cast((year(BIRTHDAT)) as SYSIBM.SMALLINT)))@
или
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create table MYTAB
(
    FAM       varchar( 40 )  not null,
    NAM      varchar( 40 )  not null,
    PTR      varchar( 40 )  not null,
    SEX       character( 1 ) not null,
    BIRTHDAT  date         not null,
    BIRTHYEAR smallint     not null,
    constraint MYTAB_CHK_SEX check (SEX in ('М','Ж')),
    constraint MYTAB_EXP_BIRTHYEAR check ("BIRTHYEAR" = (cast((year(BIRTHDAT)) as SYSIBM.SMALLINT)))
)@
, потому что после выполнения этих скриптов в SYSCAT.CHECKS (производные таблицы) садится такая же информация, что при выполнении скрипта
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
create table MYTAB
(
    FAM       varchar( 40 )  not null,
    NAM      varchar( 40 )  not null,
    PTR      varchar( 40 )  not null,
    SEX       character( 1 ) not null check (SEX in ('М','Ж')),
    BIRTHDAT  date         not null,
    BIRTHYEAR smallint     not null generated always as (cast((year(BIRTHDAT)) as SYSIBM.SMALLINT))
)@
Увидел лишь отличие в наименованиях констраинтов. Но первый вариант при добавлении записи в таблицу не срабатывает - генерация значения для BIRTHYEAR не выполняется. Значит, приведенные скрипты не одинаковы.
...
Рейтинг: 0 / 0
25.02.2009, 16:01
    #35837020
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имя для Constraint
Добрый день.
Semen PopovПоле BIRTHYEAR у меня генерируемое -
Код: plaintext
alter table MYTAB alter column BIRTHYEAR set generated always as (CAST((YEAR(BIRTHDAT)) AS SYSIBM.SMALLINT))
Посмотрел в SYSCAT.Checks (производные таблицы) и увидел, что этому Constraint было присвоено произвольное имя SQL081226104408780 и выражение вида
Код: plaintext
"BIRTHYEAR" = CAST((YEAR(BIRTHDAT)) AS SYSIBM.SMALLINT)

Могу ли я создавать констрайнт для генерируемого поля с нужным мне именем? Или переименовать существующий?Ради интереса: зачем вам нужно давать свои имена или переименовывать system-generated check constraint?
Ведь по этому имени вы не сможете ни в одной команде ссылаться на этот constraint...
...
Рейтинг: 0 / 0
25.02.2009, 16:22
    #35837106
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имя для Constraint
Mark BarinsteinРади интереса: зачем вам нужно давать свои имена или переименовывать system-generated check constraint?
Ведь по этому имени вы не сможете ни в одной команде ссылаться на этот constraint...
Да. Я сейчас уже понял, что этот check constraint добавляется системой автоматически при создании generated-полей, и его имя не разрешается изменять. Просто я наводил порядок в рабочей базе - присваивал имена всем созданным мною объектам (если имени еще не было присвоено). А тут наткнулся на этот check constraint. Один он у меня безымянный остался. Вот и захотелось переименовать. Просто не люблю, когда DB2 выдаёт какую-то ошибку (если это случается), например, с теми же check-констраинтами, и ссылается на внутреннее имя SQL... С собственными именами было бы проще разбирать ошибки.
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Имя для Constraint / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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