当前位置: 首页 > 知识库问答 >
问题:

获取错误“重复键值违反唯一约束postgres”

方和豫
2023-03-14

我有这样的桌子:

p_id | store |      createdat      | device  | deviceserial | application
------+-------+---------------------+---------+--------------+-------------
      | z10   | 2020-09-02 08:02:39 | Android | 636363636890 | app-a
      | z10   | 2020-09-02 08:08:18 | Android | 636363636890 | app-a
      | z10   | 2020-09-02 08:10:10 | Android | 636363636890 | app-a
      | z10   | 2020-09-02 08:20:10 | Android | 636363636890 | app-a
      | z10   | 2020-09-02 10:40:11 | IOS     | 6625839827   | app-b
      | z10   | 2020-09-02 10:45:11 | IOS     | 6625839827   | app-b
      | z10   | 2020-09-02 10:50:11 | IOS     | 6625839827   | app-b
      | z11   | 2020-09-02 08:47:10 | Android | 636363636891 | app-a
      | z11   | 2020-09-02 08:55:10 | Android | 636363636891 | app-a
      | z11   | 2020-09-02 08:59:10 | Android | 636363636891 | app-a
      | z11   | 2020-09-02 13:01:11 | IOS     | 6625839828   | app-b
      | z11   | 2020-09-02 13:15:11 | IOS     | 6625839828   | app-b
      | z10   | 2020-09-02 12:03:10 | Android | 636363636890 | app-a
      | z10   | 2020-09-02 12:09:10 | Android | 636363636890 | app-a
      | z10   | 2020-09-02 12:12:10 | Android | 636363636890 | app-a
      | z10   | 2020-09-02 15:15:11 | IOS     | 6625839827   | app-b
      | z10   | 2020-09-02 15:20:11 | IOS     | 6625839827   | app-b
      | z11   | 2020-09-02 10:25:10 | Android | 636363636891 | app-a
      | z11   | 2020-09-02 10:35:10 | Android | 636363636891 | app-a

我试图插入一些查询到另一个表(device_usage_test1)。这是我的表:

create table if not exists device_usage_test1(id SERIAL,deviceserial VARCHAR(50) UNIQUE,device VARCHAR(50),deviceusage DOUBLE PRECISION)

这是我的插入命令:

insert into device_usage_test1(deviceserial,device,deviceusage) select deviceserial,device,sum(deviceusage) as deviceusage
from (
    select deviceserial,device,
         
     extract(epoch from (max(createdat)::timestamp - min(createdat)::timestamp)) as deviceusage,
     date_trunc('hour', createdat) +
     (((date_part('minute', createdat)::integer / 10::integer) * 10::integer)|| ' minutes')::interval AS hr
    FROM datatable  
    group by deviceserial,hr,device
) t
group by deviceserial,device;

稍后,我将在device_usage_test1上创建一个插入查询。所以我的设备序列必须是唯一的。但是当我尝试用deviceserial (unique)插入时。它显示错误:< code >错误:重复的键值违反了唯一约束“device _ usage _ device serial _ key”

< code >详细信息:密钥(device serial)=(6363636890)已经存在。

共有1个答案

缪成天
2023-03-14

你有数据问题。您的选择正在返回至少2个具有相同设备序列号(1004573GT7)的设备。尝试运行以下命令:

select * 
  from (select deviceserial
              ,device       
              ,extract(epoch from (max(createdat)::timestamp - min(createdat)::timestamp)) as deviceusage
              ,date_trunc('hour', createdat) +
               (((date_part('minute', createdat)::integer / 10::integer) * 10::integer)|| ' minutes')::interval AS hr
         from datatable where createdat > now() - interval '1 day' 
        group by deviceserial,hr,device
       ) s
having count(deviceserial)>1
order by deviceserial;

注意:没有给出表定义或示例数据,上述未测试。

第二:< br >不能有一个唯一的约束设备序列,同时又有多个设备用于一个设备序列。根据定义,每个deviceserail有多个设备在deviceserail上并不是唯一的。相反,您可以在两者(deviceserail,device)上定义您的唯一密钥。

drop table device_usage_test1; 
create table device_usage_test1(id serial
                               ,deviceserial varchar(50) 
                               ,device varchar(50)
                               ,deviceusage double precision
                               ,constraint device_usage_test1_pk 
                                           primary key (id)
                               ,constraint device_usage_test1_bk
                                           unique (deviceserial,device)
                               );   

然而,这允许您的初始坏数据同时具有“android”和“Android”共存。您可能希望限制设备的大写。例如:

alter table device_usage_test1
        add constraint device_initcap_check 
            check (device = initcap(device));
 类似资料:
  • 我在创建应用程序时遇到了这个问题。因此,每当我添加第一条评论时,问题都不会出现,但当我第二次尝试时,我会收到此错误: 重复的键值违反了唯一约束“tripplanner_discussion_author_id_key”详细信息:键 (author_id)=(1) 已存在。 我试图把放到 models.py,但它根本没有帮助。 models.py views.py 更新 当我登录到另一个用户时,一个

  • 我有两个表通知和消息。 Message.java 我的用例是——我将创建一条具有特定描述和开始时间的消息。如果我再次收到相同的消息,我应该能够更新结束时间。MessageId在方法generateMessageId下单独计算,因为这将作为一个标识符来查找消息是否已经保存。如果是,我将更新消息。它对第一条消息很有效,但当我尝试用更新的endTime再次保存时,我得到了 错误:重复的键值违反了唯一约束

  • 当并发客户机试图将数据插入子表时,我们面临唯一的约束冲突问题。 假设我们有1以下的表格。用户user_id、first_name、last_name。2.项目project_idproject_name和project_description。 两者都有着多对多的关系。 当两个客户端试图创建一个新用户时。假设client1创建了user1(id=aa1),子记录项目(id=1)。Client2还创

  • 这是我的stacktrace: 学生表: 学生实体:学生标识默认为自动递增 postgres控制台(这些学生由sql脚本创建): 在此处输入图像描述 我也尝试过这样生成,但这没有帮助 我用postgreql它似乎我有问题与id Generator,谢谢你的想法和答案

  • 我在django应用程序中创建了一个模型,并从pgadmin将数据填充到表中,但现在当我试图从应用程序创建记录时,它抛出了这个完整性错误: 重复的键值违反了唯一约束“packsapp_foo_pkey” 详细信息:键(id)=(4)已经存在。 这是models.py 我是否总是必须从应用程序本身插入数据? Views.py

  • 我必须交换同一表的不同行的属性。 有一列“reference_id”在 DB 中具有唯一的约束。 代码: A 级- B级- 异常跟踪: