Как создать уникальный идентификатор для существующей таблицы в PL SQL? - PullRequest
0 голосов
/ 13 октября 2018

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

Обычно я делаю это ниже в TSQL

ALTER TABLE MyTable
    ADD ID INT IDENTITY(1,1)

Мне интересно, есть ли что-то похожее в PL SQL?

Все мои результаты поиска возвращаются с несколькими шагами.

Тогда я хотел бы знать, что программист PL SQL обычно делает для идентификации записей после импорта файла.Они делают это?Для меня основная цель идентифицировать эти записи - отследить их после манипуляций / копирования.

Опять же, я понимаю, что есть решение, мой следующий вопрос - действительно ли программист PL SQL делает это, или есть другиеальтернатива, которая делает этот шаг ненужным в PL SQL?

Ответы [ 3 ]

0 голосов
/ 13 октября 2018

Ответ, данный @Littlefoot, тоже будет моей рекомендацией - но все же я подумал, что мог бы упомянуть следующий вариант, который будет работать, только если вы не собираетесь добавлять больше строк в таблицу позже.

ALTER TABLE MyTable add id number(38,0); 
update MyTable set id = rownum;
commit;  

Мой тест:

SQL> create table tst as select * from all_tables; 

Table created.

SQL> alter table tst add id number(38,0);  

Table altered.

SQL> update tst set id = rownum; 

3815 rows updated.

SQL> alter table tst add constraint tstPk primary key (id); 

Table altered.
SQL> 
SQL> select id from tst where id < 15; 

    ID
----------
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11

    ID
----------
    12
    13
    14

14 rows selected.

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

0 голосов
/ 14 октября 2018

Вы можете добавить столбец id в таблицу одним оператором (Oracle 11g, см. dbfiddle ):

alter table test_
add id raw( 16 ) default sys_guid() ;

Пример:

-- create a table without an id column
create table test_ ( str )
as
select dbms_random.string( 'x', 16 )
from dual
connect by level <= 10 ;

select * from test_ ;

STR
ULWL9EXFG6CIO72Z
QOM0W1R9IJ2ZD3DW
YQWAP4HZNQ57C2UH
EETF2AXD4ZKNIBBF
W9SECJYDER793MQW

alter table test_
add id raw( 16 ) default sys_guid() ;

select * from test_ ;

STR                     ID
ULWL9EXFG6CIO72Z    0x782C6EBCAE2D7B9FE050A00A02005D65
QOM0W1R9IJ2ZD3DW    0x782C6EBCAE2E7B9FE050A00A02005D65
YQWAP4HZNQ57C2UH    0x782C6EBCAE2F7B9FE050A00A02005D65
EETF2AXD4ZKNIBBF    0x782C6EBCAE307B9FE050A00A02005D65
W9SECJYDER793MQW    0x782C6EBCAE317B9FE050A00A02005D65

Тестирование

-- Are the id values unique and not null? Yes. 
alter table test_ 
add constraint pkey_test_ primary key ( id ) ;

-- When we insert more rows, will the id be generated? Yes.
begin 
  for i in 1 .. 100
  loop
    insert into test_ (str) values ( 'str' || to_char( i ) ) ;
  end loop ;
end ;
/

select * from test_ order by id desc ;
-- last 10 rows of the result
STR ID
str100  0x782C806E16A5E998E050A00A02005D81
str99   0x782C806E16A4E998E050A00A02005D81
str98   0x782C806E16A3E998E050A00A02005D81
str97   0x782C806E16A2E998E050A00A02005D81
str96   0x782C806E16A1E998E050A00A02005D81
str95   0x782C806E16A0E998E050A00A02005D81
str94   0x782C806E169FE998E050A00A02005D81
str93   0x782C806E169EE998E050A00A02005D81
str92   0x782C806E169DE998E050A00A02005D81
str91   0x782C806E169CE998E050A00A02005D81

По поводу других ваших вопросов:

{1} Затем я хотел бы знать, что обычно программист PL SQL делает для идентификации записей после импорта файла.Они делают это?Для меня основная цель идентифицировать эти записи - отследить их после манипуляции / копирования.

-> Как вы знаете, цель идентификатора - идентифицировать строку.Мы не «делаем что-либо с идентификаторами».Таким образом, использование вами идентификаторов кажется законным.

{2} Опять же, я понимаю, что здесь есть решение, мой следующий вопрос: действительно ли это делает программист PL SQL, или есть другая альтернатива, которая делает этот шаг ненужным?в PL SQL?

-> Не совсем уверен, что вы спрашиваете здесь.Хотя существует псевдостолбец ROWID () (см. документация ), мы не должны использовать его для идентификации строк.

"ROWID не следует использовать в качестве первичного ключа таблицы. Если вы, например, удалите и заново вставите строку с помощью утилит «Импорт и экспорт», то ее идентификатор строки может измениться. Если вы удалите строку, Oracle может переназначить свой идентификатор строки на новую строку, вставленную позже. "

0 голосов
/ 13 октября 2018

ОК, так как вы работаете в Oracle 11g, там нет столбца identity, поэтому вернитесь к несколько шагов .Вот пример:

Я создаю таблицу, которая имитирует вашу импортированную таблицу:

SQL> create table tab_import as
  2    select ename, job, sal
  3    from emp
  4    where deptno = 10;

Table created.

Добавьте столбец идентификатора:

SQL> alter table tab_import add id number;

Table altered.

Создайте последовательность, которая будет использоваться для заполнения столбца ID:

SQL> create sequence seq_imp;

Sequence created.

Обновите текущие строки:

SQL> update tab_import set
  2    id = seq_imp.nextval;

3 rows updated.

Создайте триггер, который позаботится о будущих вставках (если есть):

SQL> create or replace trigger trg_bi_imp
  2    before insert on tab_import
  3    for each row
  4  begin
  5    :new.id := seq_imp.nextval;
  6  end;
  7  /

Trigger created.

Проверьте, что в таблице на данный момент:

SQL> select * from tab_import;

ENAME      JOB              SAL         ID
---------- --------- ---------- ----------
CLARK      MANAGER         2450          1
KING       PRESIDENT       5000          2
MILLER     CLERK           1300          3

Давайте import еще несколько строк:

SQL> insert into tab_import (ename, job, sal)
  2    select ename, job, sal
  3    from emp
  4    where deptno = 20;

3 rows created.

триггер имел молча заполнил столбец ID:

SQL> select * From tab_import;

ENAME      JOB              SAL         ID
---------- --------- ---------- ----------
CLARK      MANAGER         2450          1
KING       PRESIDENT       5000          2
MILLER     CLERK           1300          3
SMITH      CLERK            800          4
JONES      MANAGER         2975          5
FORD       ANALYST         3000          6

6 rows selected.

SQL>

Вскоре: вам нужно

  • изменить таблицу и добавить столбец ID
  • создать последовательность
  • создать триггер

Конец.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...