Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 NULL Шрёдингера  [new]
Вадиман
Member

Откуда: Владивосток
Сообщений: 1072
Всем привет.

Мне кажется, что я видел подобную тему, но ни автора, ни ключевых слов подобрать не могу.
Ерунда какая-то случилась:

CREATE TABLE x (
...
GENERATE_TOKEN VARCHAR2(1 BYTE) DEFAULT ON NULL 'N' NOT NULL,
...);


SQL> ALTER TABLE x MODIFY generate_token NULL;
ALTER TABLE x MODIFY generate_token NULL
*
ERROR at line 1:
ORA-01451: column to be modified to NULL cannot be modified to NULL


SQL> ALTER TABLE x MODIFY generate_token NOT NULL;
ALTER TABLE x MODIFY generate_token NOT NULL
*
ERROR at line 1:
ORA-01442: column to be modified to NOT NULL is already NOT NULL


SQL> SELECT COUNT(*) FROM x WHERE generate_token IS NULL;

COUNT(*)
----------
0

SQL> SELECT DISTINCT DUMP(generate_token) FROM x;

DUMP(GENERATE_TOKEN)
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Typ=1 Len=1: 89
NULL
Typ=1 Len=1: 78

SQL> spool off

Когда-то на таблице был check constraint novalidate вида (generate_token IN ('Y', 'N')). Сейчас его нет. Но NOT NULL-то никуда не делся. Как это?

Oracle Database 12c Enterprise Edition Release 12.1.0.2.0
26 сен 17, 14:02    [20823822]     Ответить | Цитировать Сообщить модератору
 Re: NULL Шрёдингера  [new]
Вадиман
Member

Откуда: Владивосток
Сообщений: 1072
Забыл добавить:

SQL> SELECT COUNT(*) FROM x WHERE SYS_OP_MAP_NONNULL(generate_token) = SYS_OP_MAP_NONNULL(NULL);

COUNT(*)
----------
дофига
26 сен 17, 14:11    [20823866]     Ответить | Цитировать Сообщить модератору
 Re: NULL Шрёдингера  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
Вадиман,

а в чем конкретно проблема?
покажи
SELECT generate_token, COUNT(*) from x group by generate_token
26 сен 17, 14:43    [20824020]     Ответить | Цитировать Сообщить модератору
 Re: NULL Шрёдингера  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
Вадиман,

http://www.oracle.com/technetwork/articles/sql/11g-schemamanagement-089869.html
26 сен 17, 14:45    [20824039]     Ответить | Цитировать Сообщить модератору
 Re: NULL Шрёдингера  [new]
Вадиман
Member

Откуда: Владивосток
Сообщений: 1072
xtender
Вадиман,

а в чем конкретно проблема?
покажи
SELECT generate_token, COUNT(*) from x group by generate_token

Я уже приводил distinct выше:

SQL> SELECT generate_token, COUNT(*) from x group by generate_token;

G COUNT(*)
- ----------
548644
Y 2
N 389666

SQL> spool off
27 сен 17, 02:11    [20825553]     Ответить | Цитировать Сообщить модератору
 Re: NULL Шрёдингера  [new]
Вадиман
Member

Откуда: Владивосток
Сообщений: 1072
xtender
Вадиман,

а в чем конкретно проблема?
[/src]

Проблема в том, что при действующем NOT NULL имеем NULLs в колонке
27 сен 17, 02:13    [20825554]     Ответить | Цитировать Сообщить модератору
 Re: NULL Шрёдингера  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
а, невнимательно посмотрел...
Это определение таблицы получено с помощью dbms_metadata.get_ddl или реально так таблица создавалась?
В эту таблицу лодырем или директом не заливается?

Вадиман
Но NOT NULL-то никуда не делся.

Покажи
select * 
from user_constraints 
where table_name='X'
 and search_condition_vc like '%GENERATE_TOKEN%'

last_change там какой стоит?


зы. вообще 12.1.0.2 сыроватая версия
27 сен 17, 03:06    [20825560]     Ответить | Цитировать Сообщить модератору
 Re: NULL Шрёдингера  [new]
Вадиман
Member

Откуда: Владивосток
Сообщений: 1072
SQL> select *
2 from dba_constraints
3 where table_name='X'
4 and search_condition_vc like '%GENERATE_TOKEN%';

OWNER CONSTRAINT_NAME CONSTRAINT TABLE_NAME SEARCH_CONDITION SEARCH_CONDITION_VC R_OWNER R_CONSTRAI DELETE_RUL STATUS DEFERRABLE DEFERRED VALIDATED GENERATED BAD RELY LAST_CHANGE INDEX_OWNE INDEX_NAME INVALID VIEW_RELATED ORIGIN_CON_ID
---------- --------------- ---------- ---------- -------------------------------------------------- -------------------------------------------------- ---------- ---------- ---------- ---------- --------------- --------------- ---------- --------------- --- ---- -------------------- ---------- ---------- ---------- --------------- -------------
PSP SYS_C00175411 C X "GENERATE_TOKEN" IS NOT NULL "GENERATE_TOKEN" IS NOT NULL ENABLED NOT DEFERRABLE IMMEDIATE VALIDATED GENERATED NAME 27-JUN-17 0

SQL> spool off

История такова:
1. сначала ALTER TABLE x ADD COLUMN generate_token VARCHAR2(1 BYTE) DEFAULT ON NULL 'N'
2. потом создавалась другая таблица, куда переливались данные из существующей X, и в этой другой таблице колонка generate_token уже была объявлена как DEFAULT ON NULL 'N' NOT NULL
3. INSERT as SELECT, DROP, RENAME. Здесь, наверное, и был direct path load.

Проблема с этого момента тянется.
27 сен 17, 03:44    [20825567]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить