powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Реализовать constraint
19 сообщений из 44, страница 2 из 2
Реализовать constraint
    #40047763
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY, Elic подскажите, как с этим бороться:
Код: plsql
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.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
SQL> drop table softmaster.master;
drop table softmaster.master
                      *
ERROR at line 1:
ORA-00942: table or view does not exist


SQL> create table softmaster.master(a int,b int not null);

Table created.

SQL> alter table softmaster.master
  2    add (
  3         a1 int generated always as (decode(b,null,null,a)),
  4         b1 int generated always as (decode(a,null,null,b))
  5        );

Table altered.

SQL> alter table softmaster.master
  2    add constraint master_a1_b1  unique (a1, b1);

Table altered.

SQL> insert into softmaster.master(a, b) values (1, 1);

1 row created.

SQL> insert into softmaster.master(a, b) values (1, 1);
insert into softmaster.master(a, b) values (1, 1)
*
ERROR at line 1:
ORA-00001: unique constraint (SOFTMASTER.MASTER_A1_B1) violated


SQL> insert into softmaster.master(a, b) values (null, 1);

1 row created.

SQL> insert into softmaster.master(a, b) values (null, 1);

1 row created.

SQL> commit;

Commit complete.

SQL> CREATE OR REPLACE function softmaster.GetB return int is
  2    result number;
  3  begin
  4    result := 10;
  5    return result;
  6  end;
  7  /

Function created.

SQL> SHOW ERRORS;
No errors.
SQL>
SQL> drop table softmaster.detail;

Table dropped.

SQL> create table softmaster.detail(a int, b int, c int);

Table created.

SQL> alter table softmaster.detail
  2    add (
  3         a1 int generated always as (decode(b,null,null,a)),
  4         b1 int generated always as (decode(a, null, null, softmaster.GetB())
)
  5        );
       b1 int generated always as (decode(a, null, null, softmaster.GetB()))
                                                         *
ERROR at line 4:
ORA-30553: The function is not deterministic



deterministic что есть не могу найти четкое определение?

И что изменится если данную функцию я сделаю таковой?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE OR REPLACE function softmaster.GetB return int deterministic is
  result number;
begin
  result := 10;
  return result;
end;
/
SHOW ERRORS;
...
Рейтинг: 0 / 0
Реализовать constraint
    #40047768
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet

deterministic что есть не могу найти четкое определение?

И что изменится если данную функцию я сделаю таковой?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE OR REPLACE function softmaster.GetB return int deterministic is
  result number;
begin
  result := 10;
  return result;
end;
/
SHOW ERRORS;



Function Declaration and Definition :

DETERMINISTIC

Tells the optimizer that the function returns the same value whenever it is invoked with the same parameter values (if this is not true, then specifying DETERMINISTIC causes unpredictable results).

Creating a Function-Based Index :

In addition to the prerequisites for creating a conventional index, if the index is based on user-defined functions, then those functions must be marked DETERMINISTIC.

Код: plsql
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.
SQL> create table detail(a int, b int, c int)
  2  /

Table created.

SQL> CREATE OR REPLACE
  2    function GetB
  3      return int
  4      deterministic
  5      is
  6          result number;
  7      begin
  8          result := 10;
  9          return result;
 10  end;
 11  /

Function created.

SQL> alter table detail
  2    add (
  3         a1 int generated always as (decode(b,null,null,a)),
  4         b1 int generated always as (decode(a,null,null,GetB())
  5        )
  6       )
  7  /

Table altered.

SQL>



SY.
...
Рейтинг: 0 / 0
Реализовать constraint
    #40047769
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet

SQL> alter table softmaster.detail
2 add (
3 a1 int generated always as (decode(b,null,null,a)),
4 b1 int generated always as (decode(a, null, null, softmaster.GetB())
)
5 );
b1 int generated always as (decode(a, null, null, softmaster.GetB()))
*
ERROR at line 4:
ORA-30553: The function is not deterministic

[/src]

deterministic что есть не могу найти четкое определение?

И что изменится если данную функцию я сделаю таковой?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE OR REPLACE function softmaster.GetB return int deterministic is
  result number;
begin
  result := 10;
  return result;
end;
/
SHOW ERRORS;


https://docs.oracle.com/en/database/oracle/oracle-database/12.2/lnpls/DETERMINISTIC-clause.html#GUID-6AECC957-27CC-4334-9F43-0FBE88F92654] DETERMINISTIC Clause
The deterministic option marks a function that returns predictable results and has no side effects .
(Детерминированная опция отмечает функцию, которая возвращает предсказуемые результаты и не имеет побочных эффектов .)

То есть вы помечаете, что это такая функция, возвращаемые значения которой предсказуемы
и нет от неё побочных эффектов.

То есть указываете, что сколько бы раз вы не вызвали функцию без аргументов, она вернет одно и то же значение.
...
Рейтинг: 0 / 0
Реализовать constraint
    #40047771
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet
Как думаешь при таких данных нужна она или же обойдемся триггером?
Чудак, за твою зарплату тебе придётся отчитываться самому.
...
Рейтинг: 0 / 0
Реализовать constraint
    #40047773
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet,

С учетом уже проведенного обсуждения сформулируйте, пожалуйста,
с самого начала и до самого конца максимально точно и исчерпывающе,
что именно вы хотите сделать?
Как должна реагировать база на те или иные действия?
Другие сведения?

При этом не нужно писать никаких слов и предположений про то,
как именно это будет реализовано.

То есть вы формулируете техническое задание, а мы предлагаем, как его реализовать.
Обсуждаем это между собой, а потом с вами.

Чтобы у нас с вами не получалось что-то вроде


P.S. Кстати, эта старая известная картинка была в весьма неплохой статье
Бизнес и системный аналитик. Что нужно знать

В ней есть раздел
"Научите заказчика отвечать на вопрос «Что?»,
а не формулировать требования в формате «Как»"
...
Рейтинг: 0 / 0
Реализовать constraint
    #40047776
Правильный Вася
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот я тоже читал-читал, но так и не понял, зачем нужно при пустом А подставлять В, а при пустом В подставлять А. Да ещё и с учётом того, что В физически не может быть пустым.

Вот нафига эти пляски с FB-индексами?
Можно ж просто добавить поле в существующую таблицу, заполнить его (если это прямо уж так нужно) и сделать новый констрейнт.
Ведь 2-е поле в существующем констрейнте - это ОСЛАБЛЕНИЕ ограничения, т.е. особых проблем на существующих данных не должно привносить.
...
Рейтинг: 0 / 0
Реализовать constraint
    #40047789
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic
AlexFF__|
Нет в этой таблице уникального индекса на два поля.
Об этом прямо и говорит ошибка: ORA-02270 no matching primary or unique key for then column list
Отвратительно слабовато. Ошибка ничего про индексы не говорит в принципе.

Стыд мне и позор!
Мало того, что сам не вижу различия между индексами и ограничениями целостности, так еще и ввел в заблуждение уважаемых гуру форума ;)
Но все в любом случае молодцы.
Тема, которая должна была окончится на 3-4 сообщении с комментарием "чтозахреньпридумалисрочноменять" уже заходит за 2 страницы )
...
Рейтинг: 0 / 0
Реализовать constraint
    #40047823
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL*Plus, в посте 22284458 сформулировал исходные данные.

Еще раз для AlexFF__| изначально таблица softmaster.master была c одним уникальным ключом softmaster.master.a,
далее понадобилось изменить уникальный ключ таблицы - добавив уникальный ключ из двух полей softmaster.master.a и softmaster.master.b, но при попытке добавить уникальный индекс (ограничение unique) имеем ошибку:

Код: plsql
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.
SQL> create table softmaster.master(a int, b int);

Table created.

SQL> alter table softmaster.master
  2    add constraint uq_a unique (a);

Table altered.

SQL> insert into softmaster.master(a, b) values (1, 1);

1 row created.

SQL> insert into softmaster.master(a, b) values (null, 1);

1 row created.

SQL> insert into softmaster.master(a, b) values (null, 1);

1 row created.

SQL> alter table  softmaster.master drop constraint uq_a;

Table altered.

SQL> alter table softmaster.master
  2    add constraint uq_a_b unique (a, b);
  add constraint uq_a_b unique (a, b)
                 *
ERROR at line 2:
ORA-02299: cannot validate (SOFTMASTER.UQ_A_B) - duplicate keys found



То есть, если уникальный индекс состоит из нескольких полей и хоть одно поле непустое - запись в индекс будет сделана (причем все значения полей, включая NULL). Соответственно вторая запись с теми же значениями будет нарушать ограничение уникальности.

В связи с этим понадобилось ввести следующий FBI-индекс:
Код: plsql
1.
create unique index softmaster.uq_a_b on softmaster.master (decode(b, null, null, a), decode(a, null, null, b));



Вопрос, быть может в Oracle есть способ сделать таким образом, чтобы не прибегать к созданию таких FBI-индексов, я
этого не нашел.
...
Рейтинг: 0 / 0
Реализовать constraint
    #40047831
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet
То есть, если уникальный индекс состоит из нескольких полей и хоть одно поле непустое - запись в индекс будет сделана (причем все значения полей, включая NULL). Соответственно вторая запись с теми же значениями будет нарушать ограничение уникальности.
Тебя уже спросили -- на какую конкретную УНИКАЛЬНУЮ запись будет ссылаться дочерняя запись?
...
Рейтинг: 0 / 0
Реализовать constraint
    #40047834
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Любомудров, я же говорил, что поле дочерней таблицы detail.a ссылается на master.a, поле detail.b на master.b.
...
Рейтинг: 0 / 0
Реализовать constraint
    #40047837
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Точнее, в дочерней таблице запись detail.a, detail.b ссылается на запись master.a, master.b
...
Рейтинг: 0 / 0
Реализовать constraint
    #40047838
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запись master.a, master.b уникальна.
...
Рейтинг: 0 / 0
Реализовать constraint
    #40047869
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnetЗапись master.a, master.b уникальна.

Ошибка говорит об обратном.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Реализовать constraint
    #40047895
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet
Запись master.a, master.b уникальна.


Код: plsql
1.
2.
3.
4.
SQL> alter table softmaster.master
  2    add constraint uq_a unique (a); -- Тогда почему unique (a) а не unique (a,b) ?

Table altered.



SY.
...
Рейтинг: 0 / 0
Реализовать constraint
    #40047906
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
wsnet
Запись master.a, master.b уникальна.


Код: plsql
1.
2.
3.
4.
SQL> alter table softmaster.master
  2    add constraint uq_a unique (a); -- Тогда почему unique (a) а не unique (a,b) ?

Table altered.



SY.


Раньше было именно так уникальное поле a в таблице.

То есть можно было хранить записи в таблице:

Код: plsql
1.
2.
3.
4.
5.
a b
1 1
2 2
null 3
null 3



Сейчас при попытке ввести уникальную запись по двум полям a и b:

Код: plsql
1.
2.
3.
4.
SQL> alter table softmaster.master
  2    add constraint uq_a_b unique (a, b); 

Table altered.



позволит хранить записи:


Код: plsql
1.
2.
3.
4.
5.
a b
1 1
1 2
1 3
null 3


А вот хранить (таких записей много в таблице на текущий момент) или добавить еще одну запись:
Код: plsql
1.
null 3



Не получается из-за ошибки в посте 22284635 .

Как обойти это средствами Oracle я не нашел поэтому и сделал FBI-индекс.
...
Рейтинг: 0 / 0
Реализовать constraint
    #40047911
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnetКак обойти это средствами Oracle я не нашел поэтому и сделал FBI-индекс.

А следовало вправить мозги тому чудаку, который так криво базу спроектировал.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Реализовать constraint
    #40047913
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet

Сейчас при попытке ввести уникальную запись по двум полям a и b:


Значит нет у тебя уникальности по a,b. Ты бы для начала выдал все требования. Хотя все твои проблемы стары как мир - нормализация:

Код: plsql
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.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
SQL> drop table detail purge;

Table dropped.

SQL> drop table master purge;

Table dropped.

SQL>
SQL> create table master(id int,a int,b int not null);

Table created.

SQL> alter table master
  2    add constraint pk_master
  3      primary key(id);

Table altered.

SQL> create unique index uq_a_b
  2    on master(decode(b,null,null,a),decode(a,null,null,b));

Index created.

SQL> -- insert records
SQL> insert into master(id,a,b) values(1,1,1);

1 row created.

SQL> insert into master(id,a,b) values(2,1,2);

1 row created.

SQL>
SQL> insert into master(id,a,b) values(3,null,1);

1 row created.

SQL> insert into master(id,a,b) values(4,null,1);

1 row created.

SQL>
SQL> insert into master(id,a,b) values(5,1,null);
insert into master(id,a,b) values(5,1,null)
                                      *
ERROR at line 1:
ORA-01400: cannot insert NULL into ("SCOTT"."MASTER"."B")


SQL> insert into master(id,a,b) values(6,1,null);
insert into master(id,a,b) values(6,1,null)
                                      *
ERROR at line 1:
ORA-01400: cannot insert NULL into ("SCOTT"."MASTER"."B")


SQL>
SQL> insert into master(id,a,b) values(7,null,null);
insert into master(id,a,b) values(7,null,null)
                                         *
ERROR at line 1:
ORA-01400: cannot insert NULL into ("SCOTT"."MASTER"."B")


SQL> insert into master(id,a,b) values(8,null,null);
insert into master(id,a,b) values(8,null,null)
                                         *
ERROR at line 1:
ORA-01400: cannot insert NULL into ("SCOTT"."MASTER"."B")


SQL>
SQL> create table detail(master_id int,c int);

Table created.

SQL> alter table  detail
  2    add constraint fk_detail_a_b foreign key(master_id)
  3    references master(id);

Table altered.

SQL>



SY.
...
Рейтинг: 0 / 0
Реализовать constraint
    #40048019
Правильный Вася
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet
Вячеслав Любомудров, я же говорил, что поле дочерней таблицы detail.a ссылается на master.a, поле detail.b на master.b.

Это ПОЛЯ. А тебе говорят о ЗАПИСЯХ.

Вот есть у тебя 2 одинаковых записи (и в обеих NULL в поле A). На какую ИЗ НИХ должна ссылаться запись в дочерней таблице?
...
Рейтинг: 0 / 0
Реализовать constraint
    #40048035
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet
SQL*Plus, в посте 22284458 сформулировал исходные данные.

Нет.
Там приведен набор команд - попытка решения задачи, которая четко не сформулирована.

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

Попробуйте.

Сформулируете ваше ТЗ?

Не надо писать КАК делать, напишите ЧТО вам нужно сделать.
...
Рейтинг: 0 / 0
19 сообщений из 44, страница 2 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Реализовать constraint
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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