Создание идентификатора, объединяющего несколько других столбцов - PullRequest
0 голосов
/ 04 июня 2018

Я работаю над БД и хотел бы внедрить систему, в которой уникальный идентификатор таблицы создается путем объединения нескольких других идентификаторов / факторов.По сути, я бы хотел, чтобы идентификатор выглядел следующим образом:

  • 1234 (ссылка на стандартный инкрементный серийный идентификатор из другой таблицы)
  • 10 (ссылка на стандартное инкрементное увеличениесерийный идентификатор из другой таблицы)
  • 1234 (число, которое увеличивается с 1000-9999)

Таким образом, идентификатор будет выглядеть следующим образом:

1234101234

Кроме того,каждая из этих «записей» будет иметь несколько чувствительных ко времени экземпляров, которые хранятся в другой таблице.Для этих идентификаторов я хочу взять вышеуказанный идентификатор и добавить метку времени, чтобы он выглядел так:

12341012341234567890123

Я немного посмотрел на последовательности PSQL, но они выглядят так, как будто онив основном используется для простого увеличения или уменьшения на определенных уровнях, я не уверен, как сделать такое объединение при создании строки идентификатора или даже возможно ли это.

Ответы [ 3 ]

0 голосов
/ 04 июня 2018

Я не уверен, что вы хотите достичь, но

SELECT col_1::text || col_2::text || col_3::text || now()::text

должно работать.Вы также должны добавить уникальное ограничение на столбец, то есть

 ALTER TABLE this_table ADD UNIQUE INDEX (this_new_column);

Но реальный вопрос: почему вы хотите это сделать?Если вам нужен уникальный бессмысленный идентификатор, вам просто нужно создать столбец типа serial.

0 голосов
/ 04 июня 2018
create procedure f_return_unq_id(
    CONDITIONAL_PARAMS IN INTEGER,
    v_seq in out integer
)
is 
    QUERY_1 VARCHAR2(200);
    RESP INTEGER;
BEGIN
    QUERY_1:='SELECT TAB1.SL_ID||TAB2.SL_ID||:v_seq||SYSTIMESTAMP FROM TABLE1 TAB1,TABLE2 TAB2 WHERE TAB1.CONDITION=:V_PARAMS';
    BEGIN
        EXECUTE IMMEDIATE QUERY_1 INTO RESP USING v_seq,CONDITIONAL_PARAMS;
    EXCEPTION
        when others then
            DBMS_OUTPUT.PUT_LINE(SQLCODE);
    END;
    v_seq:=RESP;
EXCEPTION
    when others then
        DBMS_OUTPUT.PUT_LINE(SQLCODE);
END;

передать v_seq этой процедуре в качестве вашего порядкового номера 1000-9999 и условных параметров, если они есть.

0 голосов
/ 04 июня 2018

Не делай этого!Просто используйте серийный идентификатор первичного ключа, а затем три разных столбца:

  • otherTableID
  • otherTable2ID
  • timestamp

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

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