标签: sequence

手动插入带有主键序列的postgres表

我在生命中第一次将MySQL表转换为PostgreSQL,并遇到了没有auto_increment的传统新手问题.

现在我发现postgres解决方案是使用一个序列,然后在每次插入时请求此序列的nextval()作为默认值.我还读过SERIAL类型自动创建序列和主键,即使在内部事务中调用时,nextval()也会递增计数器,以避免锁定序列.

我无法解决的问题是当您使用UNIQUE或PRIMARY约束以及序列的nextval()作为默认值手动将值插入到字段中时会发生什么.据我所知,当序列达到该值时,这会导致INSERT失败.

是否有一种简单(或常见)的​​方法来解决这个问题?

非常感谢明确的解释.

更新:如果你觉得我不应该这样做,永远无法解决这个问题或者做出一些有缺陷的假设,请随时在你的答案中指出它们.最重要的是,请告诉我该怎么做,为程序员提供一个稳定而强大的数据库,不会被简单的插入损坏(最好不要隐藏存储过程后面的所有内容)

postgresql primary-key sequence

12
推荐指数
1
解决办法
2万
查看次数

删除PostgreSQL中的表而不删除关联的序列

我有一张桌子foo.为了快速升级/部署我的网站,我创建了一个新表tmp_foo,以包含一些新数据:

create table tmp_foo (like foo including constraints including defaults including indexes);
Run Code Online (Sandbox Code Playgroud)

现在每个表都有一个PK id列,如下所示:

   Column    |         Type          |                                Modifiers                                 
-------------+-----------------------+--------------------------------------------------------------------------
 id          | integer               | not null default nextval('foo_id_seq'::regclass)
Run Code Online (Sandbox Code Playgroud)

重要的是,两个表都依赖于完全相同的序列foo_id_seq.没有tmp_foo_id_seq.这对我来说似乎没问题.

在此之后,我加载tmp_foo了新数据并重命名了表格,以便tmp_foo接管真实foo,并且原始版本foo成为了foo_old.现在我试着放弃foo_old:

db=> drop table foo_old ;
ERROR:  cannot drop table foo_old because other objects depend on it
DETAIL:  default for table foo_old column id depends on sequence foo_id_seq
Run Code Online (Sandbox Code Playgroud)

很公平,id …

sql postgresql sequences sequence

12
推荐指数
1
解决办法
5315
查看次数

重启,以便nextval是下一个未使用的id

我有一个脚本将表数据从一个DB复制到另一个DB,但ID列由序列支持,因此当新记录插入目标表时,nextval(seq)返回错误的值.

我需要更新序列,以便从下一个可用ID开始.

我想做的事情如下:

ALTER SEQUENCE seq_id RESTART WITH
    (SELECT MAX(id) FROM tbl);
Run Code Online (Sandbox Code Playgroud)

但是上面会产生语法错误.

任何人都可以提出替代方法吗?

sql postgresql sequence

12
推荐指数
1
解决办法
8142
查看次数

在clojure中生成从'a'到'z'的字符序列

我想生成从'a'到'z'的字符序列.在scala中,我可以非常简单地生成字符序列:

('a' to 'z')
Run Code Online (Sandbox Code Playgroud)

但在clojure中,我最终得到以下代码:

(->> (range (int \a) (inc (int \z))) (map char))
Run Code Online (Sandbox Code Playgroud)

要么

(map char (range (int \a) (inc (int \z))))
Run Code Online (Sandbox Code Playgroud)

在我看来,这很冗长.有没有更好的方法呢?

character clojure sequence

12
推荐指数
3
解决办法
6082
查看次数

时间顺序(小时)

我试过了:

seq(
     from=as.POSIXct("2012-1-1 0", tz="UTC"),
     to=as.POSIXct("2012-1-3 23", tz="UTC"),
     by="hour"
   )  
Run Code Online (Sandbox Code Playgroud)

但是我只得到最后一天的1小时(0:00:00)而不是24小时,实际上一天中的任何一小时都只有一个小时(0:00:00),我确实想要2012-1 -4.

datetime r time-series sequence

12
推荐指数
3
解决办法
1万
查看次数

散乱无序的小整数序列

背景

我有一个大的集合(〜数千)整数序列.每个序列都具有以下属性:

  1. 它的长度为12;
  2. 序列元素的顺序无关紧要;
  3. 没有元素在同一序列中出现两次;
  4. 所有元素都小于约300.

请注意,属性2.和3.意味着序列实际上是集合,但它们存储为C阵列以最大化访问速度.

我正在寻找一个好的C++算法来检查集合中是否已经存在新序列.如果不是,则将新序列添加到集合中.我考虑过使用哈希表(但请注意,我不能使用任何C++ 11构造或外部库,例如Boost).散列序列并将值存储在a std::set中也是一种选择,因为如果碰撞很少见,就可以忽略它们.任何其他建议也欢迎.

我需要一个可交换的哈希函数,即一个不依赖于序列中元素顺序的函数.我想首先将序列缩减为某些规范形式(例如排序),然后使用标准散列函数(参见下面的参考文献),但我宁愿避免与复制相关的开销(我无法修改原始序列)和排序.据我所知,下面引用的函数都不是可交换的.理想情况下,散列函数还应该利用元素永不重复的事实.速度至关重要.

有什么建议?

c++ algorithm hash set sequence

12
推荐指数
2
解决办法
3123
查看次数

在Swift中,我想将两个序列"连接"到一系列元组中

我想加入两个(或更多)序列,然后创建一系列元组.第一个元组包含每个序列的第一个元素,第二个元组包含第二个元素等等......下面是一个示例函数,它接受两个数组并创建第三个元组数组.然后我可以使用此序列来处理map(),filter()和reduce()函数.

我的例子有效,但缺乏多种方式.它适用于不适用于所有序列的数组,当第一个序列用完元素时,它会停止生成元组.我希望nils能够在元组中找到无法提供元素的短序列.它只适用于两个数组,我希望它适用于任意数量的序列,

部分解决方案会有所帮助.我是一个功能性编程新手,所以这个功能的正确名称也将受到赞赏.也许它已经在switfz库中我只知道它叫什么.我选择了"join",因为它大致类似于SQL"join",它也构建了元组(aka行)

func join<T> (s1: Array<T>, s2: Array<T>) -> Array<(T,T)> {

var g1 = s1.generate();
var g2 = s2.generate();

var result:Array<(T,T)> = []

while let e1 = g1.next() {

    if let e2 = g2.next() {
        result.append((e1,e2))
    }
}
return result
}


class Hamming {
    class func compute(input: String, against: String) -> Int {
        return join(Array(input),Array(against)).reduce(0){ return ($1.0 != $1.1) ? $0 + 1 : $0 }
    }
}

Hamming.compute("abcde","abcdf")  // 1
Run Code Online (Sandbox Code Playgroud)

arrays join sequence swift

12
推荐指数
2
解决办法
6234
查看次数

查找字符串中最重复(不是最常见)序列的算法(也称为串联重复)

我正在寻找能够在字符串中找到最重复序列的算法(可能在Python中实现).对于REPETITIVE,我指的是在不中断的情况下反复重复的任何字符组合(串联重复).

我寻找的算法一样的"寻找最常见的词"之一.实际上,重复块不需要是字符串中最常见的单词(substring).

例如:

s = 'asdfewfUBAUBAUBAUBAUBAasdkBAjnfBAenBAcs'
> f(s)
'UBAUBAUBAUBAUBA' #the "most common word" algo would return 'BA'
Run Code Online (Sandbox Code Playgroud)

不幸的是,我不知道如何解决这个问题.非常欢迎任何帮助.


UPDATE

一个额外的例子来澄清我希望返回具有最多重复次数的序列,无论其基本构建块是什么.

g = 'some noisy spacer'
s = g + 'AB'*5 + g + '_ABCDEF'*2 + g + 'AB'*3
> f(s)
'ABABABABAB' #the one with the most repetitions, not the max len
Run Code Online (Sandbox Code Playgroud)

@rici的例子:

s = 'aaabcabc'
> f(s)
'abcabc'

s = 'ababcababc'
> f(s)
'ababcababc' #'abab' would also be a solution here
             # since it is repeated …
Run Code Online (Sandbox Code Playgroud)

python parsing sequence python-3.x

12
推荐指数
2
解决办法
1251
查看次数

为什么Perl 6序列'A'...'AA'只有一个元素?

今天我注意到序列'A' ... 'AA'只包含一个元素:

> 'A' ... 'AA'
(A)
Run Code Online (Sandbox Code Playgroud)

我认为它将包含27:字母加上决赛AA.

如果我明确提供了一个生成器,它会:

> 'A', *.succ ... 'AA'
(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z AA)
Run Code Online (Sandbox Code Playgroud)

文档说默认生成器是*.succ或者*.pred取决于端点的比较方式.但:

> 'A' cmp 'AA'
Less
Run Code Online (Sandbox Code Playgroud)

所以看来我应该*.succ默认获得生成器.我绝对没有得到*.pred发电机:

> 'A', *.pred ... 'AA'
Decrement out of range
  in whatevercode  at <unknown file> line 1
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?

sequence perl6

12
推荐指数
1
解决办法
184
查看次数

什么时候需要在if语句周围加上括号来控制R中公式的顺序?

我正在尝试将数字除以两个if语句的结果之和。由于某种原因,R在完成第一个if语句后忽略两个if语句的括号,仅对第一个if语句进行除法。在第一个if语句周围加上括号时,该公式将按预期工作。问题是:为什么呢?

用ifelse(y == 2,4,1)替换if语句可以解决该问题,以及多余的括号。我很好奇为什么第一次测试会给我出乎意料的结果。

x <- 1
y <- 2 
z <- 4

test1 <- z/(if(y==2){4}else{1}+if(x==1){4}else{1})
> print(test1)

[1] 1

test2 <- z/((if(y==2){4}else{1})+if(x==1){4}else{1})
> print(test2)

[1] 0.5
Run Code Online (Sandbox Code Playgroud)

我希望test1和test2的结果均为0.5

if-statement r sequence

12
推荐指数
1
解决办法
197
查看次数