GVKun编程网logo

PostgreSQL在唯一约束中有多个可为空的列(sql 唯一约束)

15

如果您想了解PostgreSQL在唯一约束中有多个可为空的列和sql唯一约束的知识,那么本篇文章将是您的不二之选。我们将深入剖析PostgreSQL在唯一约束中有多个可为空的列的各个方面,并为您解答s

如果您想了解PostgreSQL在唯一约束中有多个可为空的列sql 唯一约束的知识,那么本篇文章将是您的不二之选。我们将深入剖析PostgreSQL在唯一约束中有多个可为空的列的各个方面,并为您解答sql 唯一约束的疑在这篇文章中,我们将为您介绍PostgreSQL在唯一约束中有多个可为空的列的相关知识,同时也会详细的解释sql 唯一约束的运用方法,并给出实际的案例分析,希望能帮助到您!

本文目录一览:

PostgreSQL在唯一约束中有多个可为空的列(sql 唯一约束)

PostgreSQL在唯一约束中有多个可为空的列(sql 唯一约束)

我们有一个遗留数据库架构,该架构具有一些有趣的设计决策。直到最近,我们仅支持Oracle和SQL
Server,但是我们试图添加对PostgreSQL的支持,这带来了一个有趣的问题。我已经搜索了Stack
Overflow和Internet的其余部分,但我不认为这种特殊情况是重复的。

对于唯一约束中的可为空的列,Oracle和SQL Server的行为相同,这实际上是在执行唯一检查时忽略为NULL的列。

假设我有下表和约束条件:

CREATE TABLE EXAMPLE
(
    ID TEXT NOT NULL PRIMARY KEY,FIELD1 TEXT NULL,FIELD2 TEXT NULL,FIELD3 TEXT NULL,FIELD4 TEXT NULL,FIELD5 TEXT NULL,...
);

CREATE UNIQUE INDEX EXAMPLE_INDEX ON EXAMPLE
(
    FIELD1 ASC,FIELD2 ASC,FIELD3 ASC,FIELD4 ASC,FIELD5 ASC
);

在Oracle和SQL Server上,保留任何可为空的列NULL都将导致仅对非null列执行唯一性检查。因此,以下插入操作只能执行一次:

INSERT INTO EXAMPLE VALUES ('1','FIELD1_DATA',NULL,NULL );
INSERT INTO EXAMPLE VALUES ('2','FIELD2_DATA','FIELD5_DATA');
-- These will succeed when they should violate the unique constraint:
INSERT INTO EXAMPLE VALUES ('3',NULL );
INSERT INTO EXAMPLE VALUES ('4','FIELD5_DATA');

但是,由于PostgreSQL(正确地)遵循SQL标准,所以这些插入(以及其中任何一个值是NULL的任何其他组合)都不会引发错误,并且可以正确插入。不幸的是,由于我们的旧模式和支持代码,我们需要PostgreSQL与SQLServer和Oracle表现相同。

我知道以下堆栈溢出问题及其答案:创建具有nullcolumn的唯一约束。据我了解,有两种解决此问题的策略:

  1. 在可为空的列同时为NULL和的情况下,创建描述索引的部分索引NOT NULL(这会导致部分索引的数量呈指数增长)
  2. COAELSCE与索引中可为空的列上的哨兵值一起使用。

(1)的问题在于,我们需要创建的部分索引的数量与我们想要添加到约束中的每个其他可空列成指数增长(如果我没有记错的话,则为2 ^
N)。(2)的问题是哨兵值减少了该列的可用值数量,并减少了所有潜在的性能问题。

我的问题:这是该问题的仅有的两种解决方案吗?如果是这样,那么在此特定用例之间它们之间的权衡是什么?一个好的答案将讨论每种解决方案的性能,可维护性,PostgreSQL如何在简单的SELECT语句中利用这些索引以及任何其他“陷阱”或需要注意的事情。请记住,5个可为空的列仅作为示例;我们的架构中有一些表格,最多可以有10个表格(是的,每次看到它我都会哭,但这就是事实)。

centos 7下源码编译安装php支持PostgreSQL postgresql手册 postgresql官网下载 postgresql视频教

centos 7下源码编译安装php支持PostgreSQL postgresql手册 postgresql官网下载 postgresql视频教

1. 下载源码

$ mkdir /usr/downloads
$ wget -c http://cn2.php.net/distributions/php-5.6.20.tar.gz
$ tar -xvf php-5.6.20.tar.gz
$ mv php-5.6.20 /usr/local/src
$ cd !$ & cd php-5.6.20
登录后复制

2. 阅读安装指导

$ ls -also
$ less README
$ less INSTALL
登录后复制

3. 安装依赖包

$ yum install apr apr-util apr-devel apr-util-devel prce lynx
登录后复制

4. 安装httpd

$ wget -c http://apache.fayea.com//httpd/httpd-2.4.20.tar.gz
$ tar -xvf httpd-2.4.20.tar.gz
$ cd httpd-2.4.20
$ ./configure \
--prefix=/usr/local/programs/apache2 \
--enable-rewrite \
--enable-so \
--enable-headers \
--enable-expires \
--with-mpm=worker \
--enable-modules=most \
--enable-deflate \
--enable-module=shared
$ make
$ make install
$ cd /usr/local/programs/apache2
$ cp bin/apachectl /etc/init.d/httpd ## 复制启动脚本
$ /etc/init.d/httpd start ## 启动apache服务器,访问http://localhost/
$ egrep -v ''^[ ]*#|^$'' /usr/local/apache2/conf/httpd.conf | nl ## 查看apache服务器的配置
## 将apache加入系统服务
vi /etc/rc.d/rc.local
```
/usr/local/programs/apache2/bin/apachectl start
```
$ cat /etc/rc.local
登录后复制

4. 安装postgresql

立即学习“PHP免费学习笔记(深入)”;

$ yum install readline-devel  ## 安装readline依赖
$ cd /usr/downloads
$ wget -c https://ftp.postgresql.org/pub/source/v9.5.0/postgresql-9.5.0.tar.bz2
$ tar -xvf postgresql-9.5.0.tar.bz2
$ cd postgresql-9.5.0
$ ./configure --prefix=/usr/local/programs/postgresql
$ make
$ su
$ make install
$ /sbin/ldconfig /usr/local/programs/postgresql/lib ## 刷新下共享动态库
$ cd /usr/local/programs/postgresql
$ bin/psql --version  ## 检查运行情况
## 开始对postgresql的配置
$ vi /etc/profile.d/postgresql.sh ## 增加环境变量,不推荐直接在/etc/profile中添加,系统更新升级时会需要merge
``` 
PATH=/usr/local/programs/postgresql:$PATH
export PATH
```
$ source /etc/profile ## 更新环境变量

## 增加用户和其他文件夹
$ adduser postgres
$ passwd postgres 
$ mkdir /usr/local/programs/postgresql/logs
$ mkdir /usr/local/programs/postgresql/data
$ chown postgres /usr/local/programs/postgresql/data
$ su - postgres

## 初始化数据库
$ ./bin/initdb -D ./data
$ ./bin/createdb test
$ ./bin/psql test
## 已有数据库,可导入data文件夹后尝试root访问,假如带密码,可能需要进一步研究下
$ ./bin/postgres -D ./data >./logs/start-log-1.log 2>&1 &
$ ./bin/psql --list  ##列出数据库
## ok,安装完成

## 自定义设置,权限控制等,可以跳过,等熟悉使用后再做
## 编辑数据库配置及权限文件:
$ vi /usr/local/programs/postgresql/data/postgresql.conf   ## 数据库配置文件
$ chown postgres postgresql.conf
$ chmod 644 postgresql.conf
$ vi /usr/local/programs/postgresql/data/pg_hba.conf   ## 权限文件
$ vi /usr/local/programs/postgresql/data/pg_ident.conf

## 设置开机自启动:
$ vi /etc/rc.d/rc.local    ## 添加如下内容
```
/usr/local/programs/postgresql/bin/postgresql start
```
登录后复制

5. 安装php

## 源码已经在第一步中下载,现在开始安装:
$ yum install libxml2 libxml2-devel libpng libpng-devel libjpeg libjpeg-devel freetype freetype-devel
$ ./configure \
--prefix=/usr/local/programs/php \
--with-apxs2=/usr/local/programs/apache2/bin/apxs \
--with-zlib \
--with-gd \
--with-jpeg-dir \
--with-png-dir \
--with-freetype-dir \
--with-zlib-dir \
--enable-mbstring \
--with-pgsql=/usr/local/programs/postgresql \
--with-pdo-pgsql=/usr/local/programs/postgresql 
$ make
$ make test
> Bug #42718 (unsafe_raw filter not applied when configured as default filter) [ext/filter/tests/bug42718.phpt]  XFAIL REASON: FILTER_UNSAFE_RAW not applied when configured as default filter, even with flags
> Bug #67296 (filter_input doesn''t validate variables) [ext/filter/tests/bug49184.phpt]  XFAIL REASON: See Bug #49184
> Bug #53640 (XBM images require width to be multiple of 8) [ext/gd/tests/bug53640.phpt]  XFAIL REASON: Padding is not implemented yet
> zend multibyte (7) [ext/mbstring/tests/zend_multibyte-07.phpt]  XFAIL REASON: https://bugs.php.net/bug.php?id=66582
> zend multibyte (9) [ext/mbstring/tests/zend_multibyte-09.phpt]  XFAIL REASON: https://bugs.php.net/bug.php?id=66582
>Bug #70470 (Built-in server truncates headers spanning over TCP packets) [sapi/cli/tests/bug70470.phpt]  XFAIL REASON: bug is not fixed yet

## 查阅官方的bug,发现:
> id=66582: status : Closed. Fixed in master (PHP7)
> id=42718: status : Assigned
> id=42718: reference to id=49184, unsolved for many years
## 那就不关心了,直接装吧
$ make install
> You may want to add: /usr/local/programs/php/lib/php to your php.ini include_path

## 那就按它说的设置吧
$ cp php.ini-development /usr/local/programs/php/lib/php.ini
```
include_path = ".;/usr/local/programs/php/lib/php"

## 然后,编辑httpd的设置,确保其能正确解析php文件
```
...
LoadModule php5_module modules/libphp5.so
...
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .php5

...
<ifmodule dir_module>
    DirectoryIndex index.html index.php
</ifmodule>     
```

## 重启httpd,测试
$ cd /usr/local/programs/apache2
$ bin/httpd -h
$ bin/httpd -k stop
$ bin/httpd -f conf/httpd.conf
## 默认设置的www页面在./htdocs/下,那就先去里面建一个测试页面吧
$ vi htdocs/index.php
```
<?php phpinfo(); ?>
```
$ curl http://localhost/index.php |grep postgresql
#ok
登录后复制

后续应该做的事

* 1. 启动时,不需要要手动指定配置文件
* 2. php初始化www目录设置
* 3. php 用户、权限管理等

'').addClass(''pre-numbering'').hide(); $(this).addClass(''has-numbering'').parent().append($numbering); for (i = 1; i '').text(i)); }; $numbering.fadeIn(1700); }); });

以上就介绍了centos 7下源码编译安装php支持PostgreSQL,包括了postgresql,centos 7方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

IntegrityError重复键值违反唯一约束-django / postgres

IntegrityError重复键值违反唯一约束-django / postgres

我正在跟着我先前提出的一个问题,在这个问题中,我试图寻求从愚蠢/编写不佳的mysql查询到postgresql的转换。我相信我成功了。无论如何,我正在使用从mysql数据库手动移动到postgres数据库的数据。我正在使用如下查询:

  """  UPDATE krypdos_coderound cru  set is_correct = case       when t.kv_values1 = t.kv_values2 then True       else False       end  from   (select cr.id,     array_agg(    case when kv1.code_round_id = cr.id     then kv1.option_id     else null end     ) as kv_values1,    array_agg(    case when kv2.code_round_id = cr_m.id     then kv2.option_id     else null end     ) as kv_values2    from krypdos_coderound cr     join krypdos_value kv1 on kv1.code_round_id = cr.id     join krypdos_coderound cr_m        on cr_m.object_id=cr.object_id        and cr_m.content_type_id =cr.content_type_id      join krypdos_value kv2 on kv2.code_round_id = cr_m.id   WHERE     cr.is_master= False     AND cr_m.is_master= True      AND cr.object_id=%s      AND cr.content_type_id=%s    GROUP BY cr.id    ) twhere t.id = cru.id    """ % ( self.object_id, self.content_type.id)  )

我有理由相信这很好。但是,这导致了新问题。尝试提交时,我从django收到一条错误,指出:

IntegrityError at (some url): duplicate key value violates unique constraint "krypdos_value_pkey"

我已经看过这里发布的一些回复,但是我还没有找到解决我的问题的方法(尽管相关的问题引起了一些有趣的阅读)。我在日志中看到了这一点,这很有趣,因为我从未明确调用insert- django必须处理它:

   STATEMENT:  INSERT INTO "krypdos_value" ("code_round_id", "variable_id", "option_id", "confidence", "freetext")   VALUES (1105935, 11, 55, NULL, E'''')    RETURNING "krypdos_value"."id"

但是,尝试运行该操作将导致重复键错误。实际的错误抛出在下面的代码中。

 # Delete current coding         CodeRound.objects.filter(object_id=o.id,content_type=object_type,is_master=True).delete()  code_round = CodeRound(object_id=o.id,content_type=object_type,coded_by=request.user,comments=request.POST.get(''_comments'',None),is_master=True)  code_round.save()  for key in request.POST.keys():    if key[0] != ''_'' or key != ''csrfmiddlewaretoken'':      options = request.POST.getlist(key)      for option in options:        Value(code_round=code_round,variable_id=key,option_id=option,confidence=request.POST.get(''_confidence_''+key, None)).save()  #This is where it dies  # Resave to set is_correct  code_round.save()  o.status = ''3''   o.save(

我检查了序列等,它们似乎是有序的。在这一点上,我不确定该怎么做-我认为这是django的事情,但我不确定。任何反馈将不胜感激!

答案1

小编典典

这发生在我身上-事实证明,你需要在Postgres中重新同步主键字段。关键是SQL语句:

SELECT setval(''tablename_id_seq'', (SELECT MAX(id) FROM tablename)+1)

Postgres 唯一约束与索引

Postgres 唯一约束与索引

据我了解文档,以下定义是等效的:

create table foo (
    id serial primary key,code integer,label text,constraint foo_uq unique (code,label));

create table foo (
    id serial primary key,label text);
create unique index foo_idx on foo using btree (code,label);

但是,Postgres 9.4 手册中的注释说:

向表添加唯一约束的首选方法是ALTER TABLE ... ADD CONSTRAINT.
使用索引来强制唯一约束可以被认为是不应该直接访问的实现细节。

(编辑:此注释已从 Postgres 9.5 的手册中删除。)

只是风格好不好?选择这些变体之一的实际后果是什么(例如在性能方面)?

PostgreSQL 8.3中具有非空且唯一约束的增量字段

PostgreSQL 8.3中具有非空且唯一约束的增量字段

我有一个带有列“ position”的表“ items”。位置具有唯一且非空的约束。为了在位置x插入新行,我首先尝试增加后续项的位置:

UPDATE items SET position = position + 1 WHERE position >= x;

这导致了唯一的约束冲突:

ERROR:  duplicate key value violates unique constraint

问题似乎出在PostgreSQL执行更新的顺序上。PostgreSQL
<9.0中的唯一约束是不可延迟的,不幸的是,当前无法使用9.0。另外,UPDATE语句不支持ORDER BY子句,并且以下命令也不起作用(仍然重复键冲突):

UPDATE items SET position = position + 1 WHERE id IN (  SELECT id FROM items WHERE position >= x ORDER BY position DESC)

有人知道不涉及迭代代码中所有项目的解决方案吗?

答案1

小编典典

另一个具有多个唯一索引的表:

create table utest(id integer, position integer not null, unique(id, position));test=# \d utest      Table "public.utest"  Column  |  Type   | Modifiers ----------+---------+----------- id       | integer |  position | integer | not nullIndexes:    "utest_id_key" UNIQUE, btree (id, "position")

一些数据:

insert into utest(id, position) select generate_series(1,3), 1;insert into utest(id, position) select generate_series(1,3), 2;insert into utest(id, position) select generate_series(1,3), 3;test=# select * from utest order by id, position; id | position ----+----------  1 |        1  1 |        2  1 |        3  2 |        1  2 |        2  2 |        3  3 |        1  3 |        2  3 |        3(9 rows)

我创建了一个以正确的顺序更新位置值的过程:

create or replace function update_positions(i integer, p integer)   returns void as $$declare  temprec record;begin  for temprec in     select *       from utest u       where id = i and position >= p       order by position desc   loop    raise notice ''Id = [%], Moving % to %'',       i,       temprec.position,       temprec.position+1;    update utest       set position = position+1       where position=temprec.position and id = i;  end loop;end;$$ language plpgsql;

一些测试:

test=# select * from update_positions(1, 2);NOTICE:  Id = [1], Moving 3 to 4NOTICE:  Id = [1], Moving 2 to 3 update_positions ------------------(1 row)test=# select * from utest order by id, position; id | position ----+----------  1 |        1  1 |        3  1 |        4  2 |        1  2 |        2  2 |        3  3 |        1  3 |        2  3 |        3(9 rows)

希望能帮助到你。

今天关于PostgreSQL在唯一约束中有多个可为空的列sql 唯一约束的分享就到这里,希望大家有所收获,若想了解更多关于centos 7下源码编译安装php支持PostgreSQL postgresql手册 postgresql官网下载 postgresql视频教、IntegrityError重复键值违反唯一约束-django / postgres、Postgres 唯一约束与索引、PostgreSQL 8.3中具有非空且唯一约束的增量字段等相关知识,可以在本站进行查询。

本文标签: