五.PRIMARY KEY ---- 主键约束

主键可以是单个字段,也可以是多个字段的组合。主键约束其实是UNIQUE和NOT NULL约束的组合,即主键必须是唯一,且各字段都是NOT NULL的。

1.创建测试表

create table tbl_primary(
a int not null,
b int,
c int,
constraint pk_tbl_primary_a_b primary key (a,b)
);

其中(a,b)是组合主键,即a和b的组合必须是唯一的,且a是not null,b也是not null的,虽然表定义中没有明确b是not null的,但是因为b是主键的一部分,增加主键时会给b增加not null约束。

测试例

test=# insert into tbl_primary (a,b,c) values (1,1,1);
INSERT 0 1
test=# insert into tbl_primary (a,b,c) values (1,2,1);
INSERT 0 1
test=# insert into tbl_primary (a,b,c) values (1,1,1);
ERROR: duplicate key value violates unique constraint "pk_tbl_primary_a_b"
DETAIL: Key (a, b)=(1, 1) already exists.
test=# insert into tbl_primary (a,c) values (1,5);
ERROR: null value in column "b" violates not-null constraint
DETAIL: Failing row contains (1, null, 5).

2.删除主键约束

test=# alter table tbl_primary drop constraint pk_tbl_primary_a_b ;
ALTER TABLE

3.增加主键约束

向已存在的表中增加主键约束就必须考虑已存在的数据不是唯一的,或者有可能是NULL,此时增加主键约束就会失败,所以增加主键约束之前先删除这些脏数据。

如果你看了前一节增加唯一约束前删除脏数据,那么这一节简直就是小kiss。

对主键来说脏数据包括2个部分:NULL和重复数据,删除NULL数据比较简单,使用下面的SQL语句即可

test=# delete from tbl_primary where a is null or b is null;

NULL数据删除后,下面主要讲如何删除重复数据,和UNIQUE处理方式相同,有两种处理方式:

一、将重复数据删除到只剩一条

二、将重复数据全部删除

方式一  将重复数据删除到只剩一条

第一步:利用表的oids属性,修改表的属性

test=# alter table tbl_primary set with oids;
ALTER TABLE

第二步:删除主键约束,清空表,写入测试数据

test=# alter table tbl_primary drop constraint pk_tbl_primary_a_b ;
ALTER TABLE
test=# delete from tbl_primary where a is null or b is null;
DELETE 0
test=# insert into tbl_primary (a,b) values (1,1),(1,1),(1,1),(2,2),(2,2);
INSERT 0 5
test=# select oid,* from tbl_primary ;
oid | a | b | c
-------+---+---+------
16423 | 1 | 1 | 1
16424 | 1 | 2 | 1
16425 | 1 | 1 | NULL
16426 | 1 | 1 | NULL
16427 | 1 | 1 | NULL
16428 | 2 | 2 | NULL
16429 | 2 | 2 | NULL
(7 rows)

第三步:查询重复数据中最小oid

test=# select min(oid) from tbl_primary group by a,b;
min
-------
16428
16423
16424
(3 rows)

第四步:查询oid不是最小的重复数据

test=# select oid,* from tbl_primary where oid not in (select min(oid) from tbl_primary group by a,b);
oid | a | b | c
-------+---+---+------
16425 | 1 | 1 | NULL
16426 | 1 | 1 | NULL
16427 | 1 | 1 | NULL
16429 | 2 | 2 | NULL
(4 rows)

第五步:删除oid不是最小的重复数据

将上面语句中的SELECT替换成DELETE即可

test=# delete from tbl_primary where oid not in (select min(oid) from tbl_primary group by a,b);
DELETE 4
test=# select oid,* from tbl_primary ;
oid | a | b | c
-------+---+---+------
16423 | 1 | 1 | 1
16424 | 1 | 2 | 1
16428 | 2 | 2 | NULL
(3 rows)

第六步:增加主键

test=# alter table tbl_primary add constraint pk_tbl_primary_a_b primary key(a,b);
ALTER TABLE

方式二  将重复数据全部删除

第一步:删除主键约束,清空表,写入测试数据

alter table tbl_primary drop constraint pk_tbl_primary_a_b ;
ALTER TABLE
test=# delete from tbl_primary;
DELETE 8
test=# insert into tbl_primary (a,b) values (1,1),(1,1),(1,1),(2,2),(2,2);
INSERT 0 5
test=# select * from tbl_primary ;
a | b | c
---+---+------
1 | 1 | NULL
1 | 1 | NULL
1 | 1 | NULL
2 | 2 | NULL
2 | 2 | NULL
(5 rows)

第二步:查询重复的数据

test=# select a,b from tbl_primary group by a,b having count(*)>1;
a | b
---+---
2 | 2
1 | 1
(2 rows)

第三步:查询所有的重复数据

test=# select * from tbl_primary where exists (select null from (select a,b from tbl_primary group by a,b having count(*)>1) tbl_temp where tbl_primary.a=tbl_temp.a and tbl_primary.b=tbl_temp.b);
a | b | c
---+---+------
1 | 1 | NULL
1 | 1 | NULL
1 | 1 | NULL
2 | 2 | NULL
2 | 2 | NULL
(5 rows)

第四步:删除所有的重复数据

将上面SQL语句中select替换成delete即可。

test=# delete from tbl_primary where exists (select null from (select a,b from tbl_primary group by a,b having count(*)>1) tbl_temp where tbl_primary.a=tbl_temp.a and tbl_primary.b=tbl_temp.b);
DELETE 5

第五步:增加主键约束

test=# alter table tbl_primary add constraint pk_tbl_primary_a_b primary key(a,b);
ALTER TABLE

postgresql----数据库表约束----PRIMARY KEY的更多相关文章

  1. postgresql数据库primary key约束/not null约束/unique约束及default值的添加与删除、列的新增/删除/重命名/数据类型的更改

    如果在建表时没有加primary key约束.not null约束.unique约束.default值,而是创建完表之后在某个字段添加的话 1.primary key约束的添加与删除 给red_pac ...

  2. 数据库六大约束用法:主键(primary key)、外键(foreign key)、非空(not null)、默认(default)、检查(check)、唯一(unique)

    1. 数据库有六大约束 主键(primary key) 外键(foreign key):被参照的键必须有唯一约束或是主键 非空(not null) 默认(default) 检查(check):orac ...

  3. 关于数据库主从表、主键PRIMARY KEY 外键约束 FOREIGN KEY 约束----NOT NULL,DEFAULT,CHECK

    如果由两个列共同组成主键,而且一个子表将主键作为可为空值的外键来继承,就可能得到错误的数据.可在一个外键列中插入有效的值,但在另一个外键列中插入空值.然后,可添加一个数据表检查约束,在可为空的外键中检 ...

  4. [MySQL数据库之表的约束条件:primary key、auto_increment、not null与default、unique、foreign key:表与表之间建立关联]

    [MySQL数据库之表的约束条件:primary key.auto_increment.not null与default.unique.foreign key:表与表之间建立关联] 表的约束条件 约束 ...

  5. Oracle数据库-primary key/foreign key和references关系

    主要介绍一下个人对主键(primary key).外键(foreign key).候选键(Candidate key).超键(super key).references的总结 概念: 主键:用户选择元 ...

  6. shell脚本检索所有mysql数据库中没有primary key的表

    1.mkdir -p /root/scripts/ 2. cd /root/scripts/ vim query.sql,代码如下: SELECT CONCAT(t.table_schema,&quo ...

  7. PostgreSQL介绍以及如何开发框架中使用PostgreSQL数据库

    最近准备下PostgreSQL数据库开发的相关知识,本文把总结的PPT内容通过博客记录分享,本随笔的主要内容是介绍PostgreSQL数据库的基础信息,以及如何在我们的开发框架中使用PostgreSQ ...

  8. PostgreSQL数据库中跨库访问解决方案

    PostgreSQL跨库访问有3种方法:Schema,dblink,postgres_fdw. 方法A:在PG上建立不同SCHEMA,将数据和存储过程分别放到不同的schema上,经过权限管理后进行访 ...

  9. 访问GitLab的PostgreSQL数据库,查询、修改、替换等操作

    1.登陆gitlab的安装服务查看配置文件 cat /var/opt/gitlab/gitlab-rails/etc/database.yml production: adapter: postgre ...

随机推荐

  1. MySQL巧用sum,case...when...优化统计查询

    最近在做项目,涉及到开发统计报表相关的任务,由于数据量相对较多,之前写的查询语句查询五十万条数据大概需要十秒左右的样子,后来经过老大的指点利用sum,case...when...重写SQL性能一下子提 ...

  2. PHP 初学

    虚拟目录和虚拟主机的关系?虚拟主机可以设置多个,虚拟目录呢? 以为phpstorm和Intellij一样,结果不是!它直接将所有内容上传(部署)到服务器即可,不像Intellij那样还调用服务器?? ...

  3. ffmpeg avformat_open_input返回失败的解决办法

    用ffmpeg做的第一个程序,参考网上的代码,就出现了一些问题,其中avformat_open_input返回失败. 下面是我在网上收集到的失败信息的相关解决: /////////////////// ...

  4. linux -- Linux下的五个查找命令:grep、find、locate、whereis、which

    1.grep grep(General Regular Expression Parser,通用规则表达式分析程序)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来. 它的使 ...

  5. 双卡手机怎么指定SIM卡打电话

    双卡手机如何指定SIM卡打电话 package com.example.dualsimtest; import android.app.Activity; import android.content ...

  6. (转)Spring开启Annotation<context:annotation-config> 和 <context:component-scan>诠释及区别

    转自:https://www.cnblogs.com/leiOOlei/p/3713989.html <context:annotation-config> 和 <context:c ...

  7. mac Virtualbox Ubuntu 设置共享目录

    如果要用VirtualBox自带的共享文件夹功能,必须先安装Guest Additions.安装方法:置顶的菜单条->devices->Install Guest Additions.点击 ...

  8. XLua系统学习

    官方网站:https://github.com/Tencent/xLua 学习手册:http://manual.luaer.cn/ 技术博客: http://blog.csdn.net/column/ ...

  9. MathType在手,公式不求人!

    很多论文达人们的论文排版是相当漂亮的,页面也非常整齐美观,即使是理工类的论文,里面有很多的数学符号和公式,排版也是非常整洁,为什么达人们的公式论文能排版的这么完美,而自已却总是不得其门而入,最后只好救 ...

  10. html5实现刮刮卡效果

    通过Canvas实现的可刮涂层效果. 修改img.src时涂层也会自动适应新图片的尺寸. 修改layer函数可更改涂层样式. 涂层: 可刮效果: 以下是HTML源代码(已增加移动设备支持): 1 2 ...