这可能吗?我有兴趣找出在UPDATE
请求中指定了哪些列,而不管正在发送的新值可能是也可能不是已存储在数据库中的值.
我想这样做的原因是因为我们有一个表可以从多个来源接收更新.以前,我们没有记录更新源自哪个来源.现在,该表存储了哪些源执行了最新更新.我们可以更改一些来源以发送标识符,但这不是所有内容的选项.所以我希望能够识别UPDATE
请求何时没有标识符,以便我可以替换默认值.
需要"配合" UPDATE
用ORDER BY
.我正在尝试使用游标,但得到错误:
Run Code Online (Sandbox Code Playgroud)cursor "cursupd" doesn't specify a line, SQL state: 24000
码:
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)
怎么做正确?
没有光标,当我这样做时:
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) 如果我定义表a
并b
如下:
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
运行了很长时间后,我在id字段中得到越来越多的漏洞.一些表的id是int32,id序列达到了它的最大值.一些Java源代码是只读的,因此我不能简单地将id列类型更改为int32
to long
,这会破坏API.
我想重新编号.这可能不是一个好的做法,但好或坏并不关心这个问题.我想重新编号,特别是那些很长的ID,如"61789238","548273826529524324".我不知道它们为什么这么长,但更短的ID也更容易手动处理.
但由于引用和约束,手动压缩ID并不容易.
PostgreSQL本身是否支持ID重新编号?或者是否有任何插件或维护工具?
也许我可以写一些存储过程?那将是非常好的,所以我可以每年安排一次.
我有两张桌子,SystemVariables
和VariableOptions
.SystemVariables
应该是不言自明的,并VariableOptions
包含所有变量的所有可能选择.
VariableOptions
有一个外键,variable_id
它指出哪个变量是一个选项.SystemVariables
有一个外键,choice_id
它指出哪个选项是当前选择的选项.
我已经利用use_alter
on choice_id
和post_update
on SystemVariables
' choice
关系绕过了循环关系.但是,我想添加一个额外的数据库约束,以确保它choice_id
是有效的(即它指的是一个引用它的选项).
假设sysVar
代表SystemVariables
表中的一行,我需要的逻辑基本上是:
VariableOptions[sysVar.choice_id].variable_id == sysVar.id
Run Code Online (Sandbox Code Playgroud)
但我不知道如何使用SQL,声明式或任何其他方法构造这种约束.如果有必要,我可以在应用程序级别验证这一点,但如果可能的话,我想在数据库级别进行验证.我正在使用Postgres 9.1.
这可能吗?
是否可以在 PostgreSQL 中创建唯一索引或其他类型的约束,这将在事务 COMMIT 上进行检查,而不是提前一毫秒?
我需要一对 (record_id, ordering) 的索引,因此我确保在给定的 record_id 中只有一个且不超过一个记录具有相同的顺序。问题出在哪里?好吧,问题在于我使用的 Web 框架处理重新排序项目的方式。看起来,当移动一个项目时,当其排序顺序发生更改时,框架会使用新的排序值写入新项目,然后不久之后它会更新另一个项目,从而创建一种临时情况,其中多个记录具有相同的订购值。重新排序所有内容后,所有记录都会更新,并且在事务提交时,一切都应该再次正常。
如果重要的话,我正在使用 PostgreSQL 10。
我有一个定义相互递归表的模型:
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
我确信这是常见的地方,但谷歌没有帮助.我试图在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) 我想更改 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) postgresql ×9
sql ×6
foreign-keys ×3
sql-update ×2
constraints ×1
database ×1
identity ×1
plpgsql ×1
python ×1
sql-order-by ×1
sqlalchemy ×1
triggers ×1
unique-index ×1