相关疑难解决方法(0)

在触发器函数中,如何获取正在更新的字段

这可能吗?我有兴趣找出在UPDATE请求中指定了哪些列,而不管正在发送的新值可能是也可能不是已存储在数据库中的值.

我想这样做的原因是因为我们有一个表可以从多个来源接收更新.以前,我们没有记录更新源自哪个来源.现在,该表存储了哪些源执行了最新更新.我们可以更改一些来源以发送标识符,但这不是所有内容的选项.所以我希望能够识别UPDATE请求何时没有标识符,以便我可以替换默认值.

postgresql triggers sql-update

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

使用ORDER BY更新

需要"配合" UPDATEORDER BY.我正在尝试使用游标,但得到错误:

cursor "cursupd" doesn't specify a line,
SQL state: 24000
Run Code Online (Sandbox Code Playgroud)

码:

BEGIN;
    DECLARE cursUpd CURSOR FOR SELECT * FROM "table" WHERE "field" = 5760 AND "sequence" >= 0 AND "sequence" < 9 ORDER BY "sequence" DESC;
    UPDATE "table" SET "sequence" = "sequence" + 2 WHERE CURRENT OF cursUpd;
    CLOSE cursUpd;
COMMIT;
Run Code Online (Sandbox Code Playgroud)

怎么做正确?

更新1

没有光标,当我这样做时:

UPDATE "CableLinePoint" AS "t"
SET "sequence" = t."sequence" + 2
from (
    select max("sequence") "sequence", "id"
    from "CableLinePoint"
    where
        "CableLine" = …
Run Code Online (Sandbox Code Playgroud)

sql postgresql sql-order-by sql-update

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

设置约束所有DEFERRED在PostgreSQL 9.3中没有按预期工作

如果我定义表ab如下:

CREATE TABLE a(i integer);
ALTER TABLE a ADD CONSTRAINT pkey_a PRIMARY KEY (i);
CREATE TABLE b(j integer);
ALTER TABLE b add CONSTRAINT fkey_ij FOREIGN KEY (j)
      REFERENCES a (i) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE;
INSERT INTO a(i) VALUES(1);
Run Code Online (Sandbox Code Playgroud)

然后执行以下操作:

START TRANSACTION;
SET CONSTRAINTS ALL DEFERRED;
INSERT INTO b(j) VALUES(2);
INSERT INTO a(i) VALUES(2);
COMMIT;
Run Code Online (Sandbox Code Playgroud)

它产生以下错误.为什么SET CONSTRAINTS没有达到预期的效果?

错误:表"b"上的插入或更新违反外键约束"fkey_ij"
SQL状态:23503详细信息:表"a"中不存在键(j)=(2).

sql postgresql database-design referential-integrity foreign-keys

12
推荐指数
2
解决办法
9999
查看次数

压缩或重新编号所有表的ID,并将序列重置为max(id)?

运行了很长时间后,我在id字段中得到越来越多的漏洞.一些表的id是int32,id序列达到了它的最大值.一些Java源代码是只读的,因此我不能简单地将id列类型更改为int32to long,这会破坏API.

我想重新编号.这可能不是一个好的做法,但好或坏并不关心这个问题.我想重新编号,特别是那些很长的ID,如"61789238","548273826529524324".我不知道它们为什么这么长,但更短的ID也更容易手动处理.

但由于引用和约束,手动压缩ID并不容易.

PostgreSQL本身是否支持ID重新编号?或者是否有任何插件或维护工具?

也许我可以写一些存储过程?那将是非常好的,所以我可以每年安排一次.

postgresql identity auto-increment compact-database

10
推荐指数
2
解决办法
4178
查看次数

SQLAlchemy中复杂的外键约束

我有两张桌子,SystemVariablesVariableOptions.SystemVariables应该是不言自明的,并VariableOptions包含所有变量的所有可能选择.

VariableOptions有一个外键,variable_id它指出哪个变量是一个选项.SystemVariables有一个外键,choice_id它指出哪个选项是当前选择的选项.

我已经利用use_alteron choice_idpost_updateon SystemVariables' choice关系绕过了循环关系.但是,我想添加一个额外的数据库约束,以确保它choice_id是有效的(即它指的是一个引用它的选项).

假设sysVar代表SystemVariables表中的一行,我需要的逻辑基本上是:

VariableOptions[sysVar.choice_id].variable_id == sysVar.id
Run Code Online (Sandbox Code Playgroud)

但我不知道如何使用SQL,声明式或任何其他方法构造这种约束.如果有必要,我可以在应用程序级别验证这一点,但如果可能的话,我想在数据库级别进行验证.我正在使用Postgres 9.1.

这可能吗?

python sql postgresql database-design sqlalchemy

9
推荐指数
1
解决办法
3252
查看次数

PostgreSQL 约束,在提交时检查,而不是更早检查

是否可以在 PostgreSQL 中创建唯一索引或其他类型的约束,这将在事务 COMMIT 上进行检查,而不是提前一毫秒?

我需要一对 (record_id, ordering) 的索引,因此我确保在给定的 record_id 中只有一个且不超过一个记录具有相同的顺序。问题出在哪里?好吧,问题在于我使用的 Web 框架处理重新排序项目的方式。看起来,当移动一个项目时,当其排序顺序发生更改时,框架会使用新的排序值写入新项目,然后不久之后它会更新另一个项目,从而创建一种临时情况,其中多个记录具有相同的订购值。重新排序所有内容后,所有记录都会更新,并且在事务提交时,一切都应该再次正常。

如果重要的话,我正在使用 PostgreSQL 10。

sql postgresql constraints unique-index unique-constraint

8
推荐指数
1
解决办法
4612
查看次数

如何处理相互递归的插入

我有一个定义相互递归表的模型:

Answer
  questionId QuestionId
  text

Question
  text
  correct AnswerId
Run Code Online (Sandbox Code Playgroud)

实际插入问题需要做什么?我需要先知道正确答案是什么.但要插入答案,我需要知道它回答了什么问题.

如果重要的话,我正在运行Postgres.

DDL是:

CREATE TABLE answer (
  id integer NOT NULL,                -- answer id
  text character varying NOT NULL,    -- answer text
  question_id bigint NOT NULL         -- question id
);

CREATE TABLE question (
  id integer NOT NULL,                 -- question id
  question character varying NOT NULL, -- question text
  correct bigint NOT NULL,             -- correct answer
  solution character varying NOT NULL  -- solution text
);

ALTER TABLE ONLY answer ALTER COLUMN …
Run Code Online (Sandbox Code Playgroud)

sql postgresql database-design referential-integrity foreign-keys

6
推荐指数
1
解决办法
1062
查看次数

如何删除具有外键依赖项的重复行?

我确信这是常见的地方,但谷歌没有帮助.我试图在PostgreSQL 9.1中编写一个简单的存储过程,它将从父cpt表中删除重复的条目.父表cpt由子表引用,lab定义为:

CREATE TABLE lab (
 recid serial NOT NULL,
 cpt_recid integer,
  ........
 CONSTRAINT cs_cpt FOREIGN KEY (cpt_recid)
   REFERENCES cpt (recid) MATCH SIMPLE
   ON UPDATE NO ACTION ON DELETE RESTRICT,
 ...
);
Run Code Online (Sandbox Code Playgroud)

我遇到的最大问题是如何获取失败的记录,以便我可以在EXCEPTION子句中使用它将子行移动lab到一个可接受的键,然后循环返回并从cpt表中删除不必要的记录.

这是(非常错误的)代码:

CREATE OR REPLACE FUNCTION h_RemoveDuplicateCPT()
  RETURNS void AS
$BODY$
BEGIN
LOOP
   BEGIN

   DELETE FROM cpt
   WHERE recid IN (
      SELECT recid
      FROM  (
         SELECT recid,
         row_number() over (partition BY cdesc ORDER BY recid) AS …
Run Code Online (Sandbox Code Playgroud)

database postgresql exception-handling foreign-keys plpgsql

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

如何在 postgres 数据库上切换两个 ID [PK]?

我想更改 Postgres 上两行的 ID,以切换它们。它们已经被定义为外键,所以我不能使用第三个数字来进行切换。

如何在一个 SQL 查询或事务中执行此操作?

例子:

UPDATE mytable SET id=2 WHERE ID=1;
UPDATE mytable SET id=1 WHERE ID=2
Run Code Online (Sandbox Code Playgroud)

sql postgresql

2
推荐指数
1
解决办法
4514
查看次数