AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 29043
Accepted
Craig Efrein
Craig Efrein
Asked: 2012-11-22 02:27:30 +0800 CST2012-11-22 02:27:30 +0800 CST 2012-11-22 02:27:30 +0800 CST

PostgreSQL 重复键违反唯一约束错误

  • 772

CentOS 6.2 64bit Server PostgreSQL 8.4.9 通过 yum 安装

我不时在 PostgreSQL 的日志中看到有关名为 events 的表的错误。事件表用于存储每次在被监控的服务器上发生特定事件时由 Zabbix 中的触发器生成的信息。

Zabbix 是唯一使用数据库服务器的应用程序。

这是错误:

INSTRUCTION :  insert into events (eventid,source,object,objectid,clock,ns,value,value_changed) values (6393428,2,3,38,1353354000,0,1,0)
ERROR:  duplicate key violates unique constraint « events_pkey »

没有与表事件关联的序列

这是事件的表结构

                               Table « public.events »
    Colonne    |  Type   |          Modificateurs           | Stockage | Description 
---------------+---------+----------------------------------+----------+-------------
 eventid       | bigint  | non NULL                         | plain    | 
 source        | integer | non NULL Par défaut, 0           | plain    | 
 object        | integer | non NULL Par défaut, 0           | plain    | 
 objectid      | bigint  | non NULL Par défaut, (0)::bigint | plain    | 
 clock         | integer | non NULL Par défaut, 0           | plain    | 
 value         | integer | non NULL Par défaut, 0           | plain    | 
 acknowledged  | integer | non NULL Par défaut, 0           | plain    | 
 ns            | integer | non NULL Par défaut, 0           | plain    | 
 value_changed | integer | non NULL Par défaut, 0           | plain    | 
Index :
    "events_pkey" PRIMARY KEY, btree (eventid)
    "events_1" btree (object, objectid, eventid)
    "events_2" btree (clock)
Référencé par :
    TABLE "acknowledges" CONSTRAINT "c_acknowledges_2" FOREIGN KEY (eventid) REFERENCES events(eventid) ON DELETE CASCADE
    TABLE "alerts" CONSTRAINT "c_alerts_2" FOREIGN KEY (eventid) REFERENCES events(eventid) ON DELETE CASCADE

问题

我可以采取哪些步骤来解决此错误?

谢谢

11/26 更新

我尝试运行 dezso 发送给我的 ALTER TABLE ALTER COLUMN 语句,但我收到有关 bigserial 类型的错误。

zabbix=# ALTER TABLE events ALTER COLUMN eventid TYPE bigserial;
ERREUR:  le type « bigserial » n'existe pas

但是,我可以使用该数据类型创建一个新表

zabbix=# \connect postgres
psql (8.4.13)
Vous êtes maintenant connecté à la base de données « postgres ».
postgres=# CREATE TABLE test(x bigserial);
NOTICE:  CREATE TABLE créera des séquences implicites « test_x_seq » pour la colonne serial « test.x »
CREATE TABLE
postgres=# \ds
              Liste des relations
 Schéma |    Nom     |   Type   | Propriétaire 
--------+------------+----------+--------------
 public | test_x_seq | séquence | postgres
(1 ligne)

我应该如何将 eventid 更改为 bigserial?

更新 11/27

我尝试了另一种方法将序列添加到列 eventid

create sequence eventid_seq;
alter table events alter column eventid set default nextval('eventid_seq');
select (max(eventid) +1) as nexteventid from events;
SELECT setval('eventid_seq', 6645754);

那行得通,但是当我重新打开 Zabbix 时,eventid 值继续增加,但序列没有。我做错了什么?

postgresql unique-constraint
  • 1 1 个回答
  • 25548 Views

1 个回答

  • Voted
  1. Best Answer
    dezso
    2012-11-25T02:25:36+08:002012-11-25T02:25:36+08:00

    (我试图从评论中编译一个答案。)

    您的应用程序生成主键值的过程中似乎存在问题。通常将其留给 DBMS 更为明智:定义一个序列并让它填充 PK 值。如果你有一个序列,你至少有选项:要么设置像

    $eventid = exec(SELECT nextval('your_sequence')) // pseudocode!
    

    并在INSERT语句中使用它,或者通过省略 PK 将其完全留给 PostgreSQL INSERT:

    INSERT INTO events (source, object, [...]) 
    VALUES (2, 3, [...]);  
    

    (我个人通常选择第二种解决方案。)

    您可以通过将 PK 列的数据类型设置为bigserial(如果是integer,则只是serial)来更改此行为:

    ALTER TABLE events ALTER COLUMN eventid TYPE bigserial;
    

    这将引发一个通知,告诉您生成了一个名为(可能)的序列events_eventid_seq。您可以如上所述使用它。

    编辑(2012-11-27)

    您可以通过如下查询设置序列

    SELECT setval('events_eventid_seq', (SELECT max(eventid) FROM events));
    

    为了让序列产生下一个值eventid,你不能在你的INSERT. 如果这样做,它将采用手动提供的值并且不会推进序列。这将在以后导致相同的唯一违规错误。

    关于ALTER TABLE:如您所见,ALTER TABLE- 类型不存在和CREATE TABLE. 你确定你在同一个数据库上尝试这个吗?我不记得旧版本了,但 8.3 已经有了bigserial速记(它不是真正的类型)。(进一步考虑,您很可能无法在 中使用它ALTER TABLE,因为它是一种速记...)您可以按照手册解决问题:

    CREATE SEQUENCE events_eventid_seq;
    
    ALTER TABLE events 
    ALTER COLUMN eventid TYPE bigint;
    
    ALTER SEQUENCE events_eventid_seq OWNED BY events.eventid;
    
    SELECT setval('events_eventid_seq', (SELECT max(eventid) FROM events));
    
    • 3

相关问题

  • 我可以在使用数据库后激活 PITR 吗?

  • 运行时间偏移延迟复制的最佳实践

  • 存储过程可以防止 SQL 注入吗?

  • PostgreSQL 中 UniProt 的生物序列

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve