postgres的序列问题。

之前新建了张表,如下:

 1 CREATE TABLE hl_14.cells
 2 (
 3   cid integer NOT NULL DEFAULT nextval(‘cells_cid_seq‘::regclass),
 4   datetime timestamp without time zone NOT NULL,
 5   cellname character varying(50) NOT NULL, -- 小区名
 6   nettype character varying(50) NOT NULL, -- 网络类型GSM900,GSM1800,TD
 8   cgi integer NOT NULL, -- 生成函数getcgi
 9   rnc character varying(50) NOT NULL,
10   lac integer NOT NULL,
11   ci integer NOT NULL,
12   lon numeric(8,5) NOT NULL,
13   lat numeric(8,5) NOT NULL,
24   CONSTRAINT cells_pkey PRIMARY KEY (cid),
25   CONSTRAINT cells_key UNIQUE (datetime, cgi)
26 )
27 WITH (
28   OIDS=FALSE
29 );
30 ALTER TABLE hl_14.cells

因为数据要不能从前台直接文件导入,需要做处理,所以每次都是给好了cid然后导入进去的。这样查询没啥问题,但是页面插入的时候出错了。

插入的sql为 insert into cells(

datetime,cellname,...) values (,,,)。插入语句都是不给cid的,这样就导致,插入的时候报错,提示该cid已经存在,查看了下cid序列当前的信息如下:
CREATE SEQUENCE cells_cid_seq
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 21715
  CACHE 1;
ALTER TABLE cells_cid_seq
  OWNER TO mrapp;

也就是后台手动导入的数据(给了cid的),不会同步更新序列的start值。

表的设计本身有问题,cid作为主键本身没有意义。所以改了表设计:

 1 CREATE TABLE cells
 2 (
 3   cid serial NOT NULL,
 4   datetime timestamp without time zone NOT NULL,
 5   cellname character varying(50) NOT NULL, -- 小区名
 6   nettype character varying(50) NOT NULL, -- 网络类型GSM900,GSM1800,TD
 8   cgi integer NOT NULL, -- 生成函数getcgi
 9   rnc character varying(50) NOT NULL,
10   lac integer NOT NULL,
11   ci integer NOT NULL,
12   lon numeric(8,5) NOT NULL,
13   lat numeric(8,5) NOT NULL,25   CONSTRAINT cells_key UNIQUE (datetime, cgi)
26 )
27 WITH (
28   OIDS=FALSE
29 );
30 ALTER TABLE cells

这个问题算是解决了吧。导入的时候不用给cid,由数据库分配。

时间: 2024-07-29 00:00:18

postgres的序列问题。的相关文章

迁移postgres时序列错误脚本修复

迁移postgres数据库的时候,有时候会出现序列与数据库值不匹配的现象.参考了https://stackoverflow.com/questions/244243/how-to-reset-postgres-primary-key-sequence-when-it-falls-out-of-sync之后, 改写了一下脚本,执行后可正常使用了. 1 do --check seq not in sync 2 $$ 3 declare 4 _r record; 5 _i bigint; 6 _m b

免费数据库(SQLite、Berkeley DB、PostgreSQL、MySQL、Firebird、mSQL、MSDE、DB2 Express-C、Oracle XE)

SQLite数据库是中小站点CMS的最佳选择 SQLite 是一个类似Access的轻量级数据库系统,但是更小.更快.容量更大,并发更高.为什么说 SQLite 最适合做 CMS (内容管理系统)呢?并不是说其他数据库不好, Oracle.MySQL.SQLServer 也都是非常优秀的 DBS,只不过他们设计目标不同,特性不同,所以只有更适用某个应用场景,没有绝对的好坏之分. 我归纳的中小型站点的CMS的特点如下: 1.数据量不超过10万 2.日页面访问量不超过10万 3. 一部分网站全部生成

postgres 设置自增类型

这里的postgres一般可以在定义的时候设置列的类型为serial4,我一般直接在navaicat上面这么做的. 如果直接用代码修改的话,可以这样,这里和oracle相似. 首先你要先建立一个序列,然后把该列绑定到这个序列上. 1 CREATE SEQUENCE floor_id_seq 2 START WITH 345 3 INCREMENT BY 1 4 NO MINVALUE 5 NO MAXVALUE 6 CACHE 1; 7 ALTER TABLE sp_floor ALTER CO

postgres 基本使用

postgres=# help 您正在使用psql, 这是一种用于访问PostgreSQL的命令行界面 键入: \copyright 显示发行条款 \h 显示 SQL 命令的说明 \? 显示 pgsql 命令的说明 \g 或者以分号(;)结尾以执行查询 \q 退出 postgres=# \? 一般性 \copyright 显示PostgreSQL的使用和发行许可条款 \g [文件] or; 执行查询 (并把结果写入文件或 |管道) \h [名称] SQL命令语法上的说明,用*显示全部命令的语法说

postgres表空间、模式、表和用户/角色之间的关系

一. 角色(role)和用户(user)   1. role      postgres=# create role kanon password 'kanon';         #使用role创建的用户默认不允许登录      postgres=# alter role kanon login;                     #修改kanon可以登录   2. user      postgres=# create user kanon2 password 'kanon2';   

postgres 常规操作杂记

分布式:1.扩容不方便(数据重分布)2.分布键变更很麻烦3.分布键选择(架构设计)谨慎4.跨库join性能差5.分布式事务性能差6.sql限制多,功能确实多7.应用改造成本巨大8.全局一致性时间点恢复几乎不可能实现 一.PGSQL 常规操作citus 分库分表:https://yq.aliyun.com/articles/647368?spm=a2c4e.11153940.0.0.428c3fb76WPkVXhttp://mysql.taobao.org/monthly/2018/01/08/备

YAML块序列

YAML的块序列表示一系列节点. 每个项目都由一个前导 - 指示符表示. 请注意,YAML中的-指示符应与具有空格的节点分开. 块序列的基本表示如下 - block sequence: ··- one↓ - two : three↓ YAML 示例 请观察以下示例以更好地理解块序列. 示例1 port: &ports adapter: postgres host: localhost development: database: myapp_development <<: *ports

如何理解“字符串是一组由16位组成的不可变的有序序列”

疑惑点: 1.16位 2.不可变 3.有序序列 解惑: 1.16位指的是:字符串每个字符所占用的空间为16bits 比特(2 bytes);这是因为JS采用的是unicode编码,每个字符需要2个字符. 2.不可变指的是: 字符串对象一旦创建出来,便不能被更改.这可能有些难理解,但事实确实如此.你可能会认为s+='1' 只是在 s 后面增加一个元素 1 而已,但事实是: 先将 s 拷贝一份,记为 temp 在 temp 末尾加上'1' 将 s 变量指向 temp,并删去原来的s 这一特性,可以从

BZOJ 3992 【SDOI2015】 序列统计

题目链接:序列统计 我来复习板子了--这道题也是我写的第一发求原根啊? 求原根方法: 从小到大依次枚举原根.设当前枚举的原根为\(x\),模数为\(p\),\(p-1\)的质因数分别为\(p_1,p_2,\dots,p_m\),则只需检验\(x^{\frac{p}{p_i}}\equiv1 \pmod{p}\)是否成立即可.如果成立则\(x\)不是原根. 然后这道题朴素\(dp\)就不讲了.设\(m\)的原根为\(g\),那么把每个数表示成\(g^k\)的形式就可以乘法变加法了,就成为了\(NT