如果您想了解PostgreSQL在唯一约束中有多个可为空的列和sql唯一约束的知识,那么本篇文章将是您的不二之选。我们将深入剖析PostgreSQL在唯一约束中有多个可为空的列的各个方面,并为您解答s
如果您想了解PostgreSQL在唯一约束中有多个可为空的列和sql 唯一约束的知识,那么本篇文章将是您的不二之选。我们将深入剖析PostgreSQL在唯一约束中有多个可为空的列的各个方面,并为您解答sql 唯一约束的疑在这篇文章中,我们将为您介绍PostgreSQL在唯一约束中有多个可为空的列的相关知识,同时也会详细的解释sql 唯一约束的运用方法,并给出实际的案例分析,希望能帮助到您!
本文目录一览:- PostgreSQL在唯一约束中有多个可为空的列(sql 唯一约束)
- centos 7下源码编译安装php支持PostgreSQL postgresql手册 postgresql官网下载 postgresql视频教
- IntegrityError重复键值违反唯一约束-django / postgres
- Postgres 唯一约束与索引
- PostgreSQL 8.3中具有非空且唯一约束的增量字段
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的唯一约束。据我了解,有两种解决此问题的策略:
- 在可为空的列同时为
NULL
和的情况下,创建描述索引的部分索引NOT NULL
(这会导致部分索引的数量呈指数增长) COAELSCE
与索引中可为空的列上的哨兵值一起使用。
(1)的问题在于,我们需要创建的部分索引的数量与我们想要添加到约束中的每个其他可空列成指数增长(如果我没有记错的话,则为2 ^
N)。(2)的问题是哨兵值减少了该列的可用值数量,并减少了所有潜在的性能问题。
我的问题:这是该问题的仅有的两种解决方案吗?如果是这样,那么在此特定用例之间它们之间的权衡是什么?一个好的答案将讨论每种解决方案的性能,可维护性,PostgreSQL如何在简单的SELECT
语句中利用这些索引以及任何其他“陷阱”或需要注意的事情。请记住,5个可为空的列仅作为示例;我们的架构中有一些表格,最多可以有10个表格(是的,每次看到它我都会哭,但这就是事实)。
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 用户、权限管理等
以上就介绍了centos 7下源码编译安装php支持PostgreSQL,包括了postgresql,centos 7方面的内容,希望对PHP教程有兴趣的朋友有所帮助。
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 唯一约束与索引
据我了解文档,以下定义是等效的:
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中具有非空且唯一约束的增量字段
我有一个带有列“ 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中具有非空且唯一约束的增量字段等相关知识,可以在本站进行查询。
本文标签: