相关疑难解决方法(0)

使用空列创建唯一约束

我有一个这种布局的表:

CREATE TABLE Favorites
(
  FavoriteId uuid NOT NULL PRIMARY KEY,
  UserId uuid NOT NULL,
  RecipeId uuid NOT NULL,
  MenuId uuid
)
Run Code Online (Sandbox Code Playgroud)

我想创建一个类似于此的唯一约束:

ALTER TABLE Favorites
ADD CONSTRAINT Favorites_UniqueFavorite UNIQUE(UserId, MenuId, RecipeId);
Run Code Online (Sandbox Code Playgroud)

但是,这将允许多行具有相同的(UserId, RecipeId)if MenuId IS NULL.我想允许NULLMenuId存储不具有关联菜单中的最爱,但我只希望每个用户/食谱对这些行中最多只有一个.

我到目前为止的想法是:

  1. 使用一些硬编码的UUID(例如全零)而不是null.
    但是,MenuId每个用户的菜单都有一个FK约束,所以我必须为每个用户创建一个特殊的"空"菜单,这是一个麻烦.

  2. 使用触发器检查是否存在空条目.
    我认为这是一个麻烦,我喜欢尽可能避免触发器.另外,我不相信他们能保证我的数据永远不会处于不良状态.

  3. 只需忘记它并检查中间件或插入函数中是否存在空条目,并且没有此约束.

我正在使用Postgres 9.0.

我有什么方法可以忽略吗?

sql postgresql null database-design referential-integrity

219
推荐指数
2
解决办法
8万
查看次数

删除PostgreSQL中的重复记录

我在PostgreSQL 8.3.8数据库中有一个表,它没有键/约束,并且有多行具有完全相同的值.

我想删除所有重复项,每行只保留1份.

特别是有一列(称为"密钥")可用于识别重复(即每个不同的"密钥"应该只存在一个条目).

我怎样才能做到这一点?(理想情况下使用单个SQL命令)在这种情况下,速度不是问题(只有几行).

sql postgresql duplicates

94
推荐指数
8
解决办法
6万
查看次数

如何在PostgreSQL中进行大型非阻塞更新?

我想在PostgreSQL中对表进行大量更新,但我不需要在整个操作中维护事务完整性,因为我知道我正在更改的列不会被写入或读取更新.我想知道psql控制台中是否有一种简单的方法可以更快地完成这些类型的操作.

例如,假设我有一个名为"orders"的表,有3500万行,我想这样做:

UPDATE orders SET status = null;
Run Code Online (Sandbox Code Playgroud)

为避免被转移到offtopic讨论,让我们假设3500万列的所有状态值当前都设置为相同(非空)值,从而使索引无用.

此语句的问题是需要很长时间才能生效(仅因为锁定),并且所有更改的行都将被锁定,直到整个更新完成.此更新可能需要5个小时,而类似

UPDATE orders SET status = null WHERE (order_id > 0 and order_id < 1000000);
Run Code Online (Sandbox Code Playgroud)

可能需要1分钟.超过3500万行,执行上述操作并将其分成35块只需要35分钟,节省了4小时25分钟.

我可以用脚本进一步分解它(在这里使用伪代码):

for (i = 0 to 3500) {
  db_operation ("UPDATE orders SET status = null
                 WHERE (order_id >" + (i*1000)"
             + " AND order_id <" + ((i+1)*1000) " +  ")");
}
Run Code Online (Sandbox Code Playgroud)

此操作可能仅在几分钟内完成,而不是35分钟.

所以这归结为我真正的要求.我不想写一个怪异的脚本来分解操作,每次我想做这样一个大的一次性更新.有没有办法在SQL中完成我想要的东西?

postgresql dblink transactions plpgsql sql-update

61
推荐指数
3
解决办法
3万
查看次数

如何在json列中查询空对象?

想要查找某个json列包含空对象的所有行,{}.这可以使用JSON数组,或者如果我在对象中查找特定键.但我只是想知道对象是否为空.似乎找不到会这样做的运营商.

 dev=# \d test
     Table "public.test"
  Column | Type | Modifiers
 --------+------+-----------
  foo    | json |

 dev=# select * from test;
    foo
 ---------
  {"a":1}
  {"b":1}
  {}
 (3 rows)

 dev=# select * from test where foo != '{}';
 ERROR:  operator does not exist: json <> unknown
 LINE 1: select * from test where foo != '{}';
                                      ^
 HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
 dev=# select * from …
Run Code Online (Sandbox Code Playgroud)

postgresql json types jsonb

55
推荐指数
4
解决办法
4万
查看次数

如何删除没有唯一标识符的重复行

我的表中有重复的行,我想以最有效的方式删除重复项,因为表很大.经过一番研究,我得出了这个问题:

WITH TempEmp AS
(
SELECT name, ROW_NUMBER() OVER(PARTITION by name, address, zipcode ORDER BY name) AS duplicateRecCount
FROM mytable
)
-- Now Delete Duplicate Records
DELETE FROM TempEmp
WHERE duplicateRecCount > 1;
Run Code Online (Sandbox Code Playgroud)

但它只适用于SQL,而不适用于Netezza.它似乎不喜欢DELETE后面的WITH条款?

sql database postgresql duplicates netezza

41
推荐指数
5
解决办法
5万
查看次数

Postgres错误:用作表达式的子查询返回多行

我有两个独立的数据库.我试图将一个数据库中的列更新为另一个数据库中的列的值:

UPDATE customer
SET customer_id=
   (SELECT t1 FROM dblink('port=5432, dbname=SERVER1 user=postgres password=309245',
   'SELECT store_key FROM store') AS (t1 integer));
Run Code Online (Sandbox Code Playgroud)

这是我收到的错误:

ERROR:  more than one row returned by a subquery used as an expression
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

sql database postgresql dblink subquery

30
推荐指数
3
解决办法
9万
查看次数

自动增量表列

使用Postgres,我试图AUTO_INCREMENT在SQL中自动编号我的主键.但是,它给了我一个错误.

CREATE TABLE Staff   (
  ID        INTEGER NOT NULL AUTO_INCREMENT,
  Name      VARCHAR(40) NOT NULL,
  PRIMARY KEY (ID)
);
Run Code Online (Sandbox Code Playgroud)

错误:

********** Error **********
ERROR: syntax error at or near "AUTO_INCREMENT"
SQL state: 42601
Character: 63
Run Code Online (Sandbox Code Playgroud)

知道为什么吗?

sql postgresql types auto-increment database-table

29
推荐指数
1
解决办法
5万
查看次数

使用PostgreSQL中另一个表的列更新表的列

我想将val1table1中一列val2的所有值复制到另一个表的一列table2.我在PostgreSQL中尝试过这个命令:

update table2
set val2 = (select val1 from table1)
Run Code Online (Sandbox Code Playgroud)

但我得到了这个错误:

错误:用作表达式的子查询返回的多行

有没有替代方法呢?

sql postgresql sql-update

26
推荐指数
1
解决办法
4万
查看次数

PostgreSQL中有多个连接的UPDATE语句

我正在尝试更新一个名为的表incode_warrants,并将其设置warn_docket_noviol_docket_noincode_violations表中.

我在Postgres 9.3中有以下SQL查询,但是当它触发时我收到以下错误:

Error : ERROR:  relation "iw" does not exist
LINE 1: update iw
Run Code Online (Sandbox Code Playgroud)

我更像是一个活跃记录的人,所以我的原始SQL技能严重缺乏.我想知道是否有人可以帮助指出我正确的方向如何正确地进行此查询.

update iw
set iw.warn_docket_no = iv.viol_docket_no
from incode_warrants as iw
INNER JOIN incode_warrantvs as iwvs
on iw.warn_rid = iwvs.warnv_rid
INNER JOIN incode_violations as iv
ON iv.viol_citation_no = iwvs.warnv_citation_no and iv.viol_viol_no = iwvs.warnv_viol_no
Run Code Online (Sandbox Code Playgroud)

sql postgresql inner-join sql-update

15
推荐指数
3
解决办法
2万
查看次数

当条件存在时,从另一个表更新表中的多个行

我有两张桌子.

表1包含公司,其位置在名为的列中使用lat/lng坐标进行地理配准the_geom

表2还包含来自Table1的相同公司,而不是地理参考,以及其他数百个地址为地理参考的公司.

我需要做的就是将Table1公司的the_geomlat/lng值插入表2中的相应条目.这些插入可以基于的共同点是列.address

简单的问题,我确定,但我很少使用SQL.

sql postgresql postgis sql-update

11
推荐指数
3
解决办法
4万
查看次数