2015-01-08 4 views
1

У меня есть таблица с именем TABLE_1, который имеет 3 колонкиКак обрабатывать ошибки Oracle [Уникальный Constraint] ошибка

row_id  row_name row_descr 
1   check1  checks here 
2   check2  checks there 

Эти строки создаются через передний конец приложения. Теперь предположим, что я удаляю запись с row_name check2 из front-end и создаю еще одну запись из front-end с именем row_name check3, в базе данных мои записи будут следующими.

row_id  row_name row_descr 
1   check1  checks here 
3   check3  checks 

Теперь ROW_ID если вы наблюдаете это не нормальный прирост один раз, теперь моя проблема я пишу заявление вставки автоматизировать что-то и я не знаю, что я должен вставить в столбце ROW_ID. Раньше я думал, что это просто новый row_id = old row_id +1. Но здесь это не так. Пожалуйста, помогите

EDIT: В настоящее время им вставляя так что неправильно:

insert into TABLE1 (row_id, row_name, row_descr 
) values ((select max (row_id) + 1 from TABLE1),'check1','checks here'); 

row_id не нормальный прирост один раз.

+0

Да, это обычный однократный приращение. это то, как это работает, когда вы автоматически читаете «идентификаторы». если вы удалите данные, он не удалит row_id.он по-прежнему остается выделенным, если вы не стреляете командой truncate –

+0

Так есть ли способ захватить row_id, так как это не нормальный прирост? – ramaswamy

+1

Как увеличивается столбец 'row_id'? Использование «последовательности» или определенной пользователем логики? –

ответ

2

Никогда не рассчитывайте идентификаторы max (id) +1, если вы не можете полностью исключить одновременные действия (что почти никогда не бывает). В оракуле (предварительная версия 12 см. Ответ Кумарса) создайте последовательность один раз и после этого вставьте значения из этих последовательностей.

create sequence my_sequence; 

Либо триггер, который означает, что вы не должны заботиться о идентификаторах во время вставки на всех:

CREATE OR REPLACE TRIGGER myTrigger 
BEFORE INSERT ON TABLE1 FOR EACH ROW 
BEGIN 
    SELECT my_sequence.NEXTVAL INTO :NEW.row_id FROM DUAL; 
END; 
/

Или непосредственно со вставкой

insert into TABLE1 (row_id, row_name, row_descr 
) values (my_sequence.nextval,'check1','checks here'); 

Помимо использования row_id как имя столбца в oracle может быть немного запутанным, из-за псевдоколоны rowid, которая имеет особое значение.

Чтобы ответить на ваш вопрос: если вам действительно нужно поймать ошибки оракула в качестве упражнений, вы можете сделать это с помощью PRAGMA EXCEPTION INIT, используя процедуру для ваших вставок. Это может выглядеть как-то так:

CREATE OR REPLACE PROCEDURE myInsert([...]) 
IS 

    value_allready_exists EXCEPTION; 

    PRAGMA EXCEPTION_INIT (value_allready_exists, -00001); 
    --ORA-00001: unique constraint violated 

BEGIN 

/* 
    * Do your Insert here 
    */ 


    EXCEPTION 
    WHEN value_allready_exists THEN 
     /* 
     * Do what you think is necessary on your ORA-00001 here 
     */ 
END myInsert; 
1

Oracle 12c представил IDENTITY колонны. Точно, Release 12.1. Это очень удобно в ситуациях, когда вам нужно иметь sequence для вашего основного столбца ключа.

Например,

SQL> DROP TABLE identity_tab PURGE; 

Table dropped. 

SQL> 
SQL> CREATE TABLE identity_tab (
    2 ID   NUMBER GENERATED ALWAYS AS IDENTITY, 
    3 text  VARCHAR2(10) 
    4 ); 

Table created. 

SQL> 
SQL> INSERT INTO identity_tab (text) VALUES ('Text'); 

1 row created. 

SQL> DELETE FROM identity_tab WHERE ID = 1; 

1 row deleted. 

SQL> INSERT INTO identity_tab (text) VALUES ('Text'); 

1 row created. 

SQL> INSERT INTO identity_tab (text) VALUES ('Text'); 

1 row created. 

SQL> INSERT INTO identity_tab (text) VALUES ('Text'); 

1 row created. 

SQL> DELETE FROM identity_tab WHERE ID = 2; 

1 row deleted. 

SQL> SELECT * FROM identity_tab; 

     ID TEXT 
---------- ---------- 
     3 Text 
     4 Text 

SQL> 

Теперь давайте посмотрим, что под капотом -

SQL> SELECT table_name, 
    2   column_name, 
    3   generation_type, 
    4   identity_options 
    5 FROM all_tab_identity_cols 
    6 WHERE owner = 'LALIT' 
    7/

TABLE_NAME   COLUMN_NAME  GENERATION IDENTITY_OPTIONS 
-------------------- --------------- ---------- -------------------------------------------------- 
IDENTITY_TAB   ID    ALWAYS  START WITH: 1, INCREMENT BY: 1, MAX_VALUE: 9999999 
               999999999999999999999, MIN_VALUE: 1, CYCLE_FLAG: N 
               , CACHE_SIZE: 20, ORDER_FLAG: N 


SQL> 

Итак, вы идете. A sequence, неявно созданный Oracle.

И не забывайте, что вы можете избавиться от sequence только с помощью опции purge с таблицей drop.

Смежные вопросы