ID序列动态

时间:2017-05-25 21:58:33

标签: sql database oracle oracle11g

我正在尝试创建一个max num为999的序列,但是我面临的问题是当我创建例如5 Id时然后我删除了3rth,我的序列将创建id 6,是否有任何触发避免空Id的方法?

示例

我用过 1 2 3 4 5 我删除了3个 1 2 4 5

我插入一个 CURRENT 结果 1 2 4 5 6

我的目标是: 1 2 3 4 5

2 个答案:

答案 0 :(得分:2)

如果您确实需要分配固定数量的资源(停车位,剧院座位,酒店房间等),您需要避免序列并为每个资源设置一个表格。

然后您使用

之类的内容分配资源
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
#include <stdlib.h>
#include <limits.h>

int main(int argc, const char *argv[])
{
    setlocale(LC_ALL, ""); // my locale is UTF-8

    wchar_t wc = 0xd834df01;
    char bytes[MB_LEN_MAX] = {0};
    int r = wctomb(bytes, wc);
    if (r > 0) {
        for (int i = 0; i < MB_LEN_MAX; i++)
            printf("0x%x\n", bytes[i]);
    } else {
        perror("fail");
    }

    return 0;
}

您需要添加错误处理,以满足您没有更多可用资源的情况。在处理少量固定数量的资源时,还存在(几乎不可避免的)并发问题。

答案 1 :(得分:0)

您永远不应重复使用ID。没理由这样做,只有麻烦。 你可以找到第一个可用的ID,包括像这样的空白,如果真的,真的需要它。但这是错误的编程实践。您的身份证可能也有现实意义,在这种情况下,您不应将其称为身份证。

select min(t1.id+1) as gap_id
    from table t1
    left join thesametable t2 on t2.id=t1.id+1
    where t2.id is null