《深入浅出PostgreSQL》屠要峰著 - 学习PostgreSQL过程中遇到的问题及解决方案(CentOS环境下)

1、规划数据库路径,即自定义数据库路径的时候报错【initdb: 目录"/home/postgres/pgdata"已存在,但不是空的如果您想创建一个新的数据库系统, 请删除或清空目录 “/home/postgres/pgdata” 或者运行带参数的 initdb而不是 “/home/postgres/pgdata”.】、【Initializing database … /sbin/restorecon set context /home/postgres/pgdata->unconfined_u:object_r:user_home_t:s0 failed:‘Operation not permitted’/home/postgres/pgdata is not writeable by postgres】和【creating directory /home/postgres/pgdata … initdb: could not create directory “/home/postgres”: Permission denied】
解决方案如下:
对于错误【initdb: 目录"/home/postgres/pgdata"已存在,但不是空的如果您想创建一个新的数据库系统, 请删除或清空目录 “/home/postgres/pgdata” 或者运行带参数的 initdb而不是 “/home/postgres/pgdata”.】,产生这个错误的原因是由于指定的数据库路径的目录【/home/postgres/pgdata】不是一个空目录,因此需要将其中的内容都清空,这样就能解决问题了。
对于错误【Initializing database … /sbin/restorecon set context /home/postgres/pgdata->unconfined_u:object_r:user_home_t:s0 failed:‘Operation not permitted’/home/postgres/pgdata is not writeable by postgres】和【creating directory /home/postgres/pgdata … initdb: could not create directory “/home/postgres”: Permission denied】,产生这两个错误的原因在于安装并启动PostgreSQL之后会自动创建一个用户【postgres】,在使用命令【su - postgres】切换到该用户后执行命令【initdb -D /home/postgres/pgdata】,由于用户【postgres】对于目录【/home/postgers/pgdata】的权限问题,可能会出现这两个错,解决方案是将目录【postgres】和【pgdata】的所属用户和所属用户组都改成用户【postgres】,使用命令【chown】。


2、切换到用户【postgres】下,运行命令【pg_ctl start 数据路径】启动数据库的时候,报错【5432端口被占用】。
解决方案:重启,或者使用命令【pg_ctl status -D 数据路径】看该数据库是否在运行,如果在运行可以先执行命令【pg_ctl stop -D 数据路径】将其关闭,之后重新开启即可。


3、在对数据库进行update和delete操作的时候报错【IntegrityError: insert or update on table “…” violates foreign key constraint “…”】。
问题举例:news表中有主键,comment_news表中有主键和外键,在数据库中设定了comment_news的外键和news主键之间建立了约束,comment_news中外键的内容有了news主键以外的内容,所以就报错了,改成一致的就好了。
解决方案:如果是删除数据表中的数据,那么需要先删除存在外键的表中的数据,之后在删除主键中对应的数据。比如news表中有主键,comment_news表中有主键和外键,先要将comment_news表中的对应数据先删掉,之后再将news表中的内容删掉。


4、使用insert语句往数据库中插入元素时报错【duplicate key value violates unique constraint】

  • 解决方案:出现这种错误的一种可能的情况是,插入的数据之前数据库中已经存在,再往里面插入的话,就会出现这种情况。因此可以从是否会有重复数据的方面来思考解决方案。

5、关于使用序列实现数据表中某个整数类型的字段自增操作说明。

  • 首先先创建一个序列。代码如下所示。

    create sequence seq_test
    start with 1
    increment by 1
    no minvalue
    no maxvalue
    cache 1;
    

    其中seq_test是序列的名称,start with 1表示从1开始,increment by 1表示每次增加1。
    之后可以通过命令【\d seq_test】来查看序列的相关属性。如下图所示。
    在这里插入图片描述

  • 之后再创建一个表。代码如下。

    create table tb_test04(           
    a int not null default nextval('seq_test'), 
    b text not null, 
    c timestamp
    );
    

    上面创建的表中,字段a要实现数值的自增,直接调用nextval函数依次遍历刚才创建的序列【seq_test】就可以了。


6、创建表时,指定某个字段的类型为【serial】,实现在插入数据时,该字段的值自增。

  • 首先创建一个数据表。代码如下所示。
    create table tb_test05(
    a serial not null, 
    b text not null, 
    c timestamp
    );
    
    创建成功后的提示如下所示。
    在这里插入图片描述
    从上面的提示可以看出,自动创建了一个隐含的序列。可以观察创建的这个序列的结构,如下图所示。
    在这里插入图片描述
    从上图可以发现,默认创建的和上面总结的第五点自己创建序列是一模一样的。可以继续观察刚刚创建的表的结构,如下图所示。
    在这里插入图片描述
    从上图可以看出字段a默认的值就是序列中的值。
  • 之后插入一条新的数据的时候,如果不指定字段a的值,便会采用默认值。

7、为什么多表查询会出现重复的数据?

扫描二维码关注公众号,回复: 12968341 查看本文章
  • 有可能在多表查询中某一列存在重复的记录,所以在连接的时候重复的记录会多次匹配。
    如下图中的情况。
    在这里插入图片描述
    最右边的列显示这两条记录都是3条。
    实际上对于149671来说之前匹配了三次。如下图所示。
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/ISs_Cream/article/details/111222061