创建组合多个其他列的标识符

时间:2018-06-04 15:15:39

标签: sql postgresql

我正在研究数据库,并希望实现一个系统,通过组合其他几个ID /因子生成表唯一ID。基本上,我想要一个看起来像这样的ID:

  • 1234(对另一个表中标准递增序列ID的引用)
  • 10(对另一个表中标准递增序列ID的引用)
  • 1234(一个从1000-9999递增的数字)

所以ID看起来像:

1234101234

此外,每个“条目”将具有存储在另一个表中的多个时间敏感实例。对于这些ID,我想获取上述ID并附加时间戳,因此它看起来像:

12341012341234567890123

我看了一下PSQL序列,但看起来它们主要用于在某些级别上升或下降,我不知道如何在创建ID字符串时进行这种连接或者是否可能。

4 个答案:

答案 0 :(得分:3)

不要这样做!只需使用序列主键ID,然后有三个不同的列:

  • otherTableID
  • otherTable2ID
  • timestamp

您可以使用序列ID唯一标识每一行。您可以查找其他信息。并且 - 甚至更好 - 您可以创建外键约束来表示表之间的关系。

答案 1 :(得分:0)

在PLSQL(Oracle服务器)中,您可以使用(||)双管线

添加三列

答案 2 :(得分:0)

我不确定你想要做什么,但是

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

应该有效。您还应该在列上添加UNIQUE约束,即

 ALTER TABLE this_table ADD UNIQUE INDEX (this_new_column);

但真正的问题是:你为什么要这样做?如果您只想要一个唯一无意义的ID,则只需要创建serial类型的列。

答案 3 :(得分:0)

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;

pass the v_seq to this procedure as your sequence number 1000-9999 and conditional parameters if any are there.