【问题标题】:Create Sequence Oracle SQL random primary keys创建序列 Oracle SQL 随机主键
【发布时间】:2023-04-05 22:45:03
【问题描述】:

我似乎找不到任何关于创建序列的信息。

如果有一个现有的数据库并且一个表 PEOPLE 有主键 SIN,如果我想生成主键。鉴于主键是随机的,我将如何做到这一点。本质上,我认为如果我只需要计算行数并将其设置为我的创建序列中的最小值,这将很容易。但是,鉴于表中的主键是随机的,我将如何实现创建序列?如果我只想添加新的主键,其值从之前插入的值递增。

或者创建序列会自动为我检查吗?

【问题讨论】:

  • 随机数对序列号的附加值是多少?如果是随机的,你必须在使用它之前检查唯一性,这对我来说似乎是一种资源浪费。我了解公共字段需要随机值,而不是 PK。
  • @CedricSimon,随机密钥的标准原因是降低 URL 破解网站的能力。在网络的早期,您可以通过将 cookie 编辑为比您指定的值低或高一个的值来劫持购物卡软件。会话键通常是 MySQL 数据库中的 AUTOINCREMENT 列。类似地想象去您的银行并下载您的银行对帐单,然后将 URL 中的任何数字编辑为减一,然后发现您可以下载其他人的银行对帐单。 (这仍然会发生!)
  • @Ven:感谢您的有趣评论。

标签: sql database oracle


【解决方案1】:

我发现下面的工作。关键是生成整个序列,排除现有的主键,最后从剩下的中选择一个随机值。此外,您必须将其打包到“BEFORE INSERT”触发器中。

select rn from (
select 
  row_number() over (order by dbms_random.random) as mx, rn 
 from (
  select rownum  as rn 
    from dual
  connect by rownum <= 10
  minus
 ( select SIN from people ) 
   )
     ) where mx = 1
;

【讨论】:

  • 主键必须是唯一的。这里的唯一性检查在哪里?
  • ...MINUS ( select SIN from people ) 你从通用序列中排除了人们已经存在的数字。
  • 不幸的是,这仍然允许冲突,因为它无法查询已被其他会话插入但尚未提交的行。
【解决方案2】:

据我所知,您需要立即执行。

declare
    n integer;
begin
   select max(sin) + 1 into n from people;
   execute immediate 'create sequence my_seq start with ' || n ||' increment by 1';
end;

编辑:我认为这个问题是创建一个序列,该序列在现有随机记录存在的情况下是唯一的。正如 Cedric 所说,我不明白主键随机的原因。

【讨论】:

  • 也许隐匿的安全性是随机主键的原因?当然,这本身就是一个坏主意……
猜你喜欢
  • 1970-01-01
  • 2015-08-06
  • 2011-03-18
  • 1970-01-01
  • 2012-03-27
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
  • 1970-01-01
相关资源
最近更新 更多