gpt4 book ai didi

sql - 处理 PostgreSQL 外键错误和。防止它们发生

转载 作者:行者123 更新时间:2023-11-29 11:57:32 25 4
gpt4 key购买 nike

如果 PostgreSQL 无论如何都会检查外键约束,我真的需要检查另一个表中的记录是否真的存在吗?

通常您会在创建 记录之前检查是否存在现有的parent 记录。但这是另一个要执行的查询。所以我认为如果只处理 PostgreSQL 错误并检查它是否与 parent 记录不存在(违反外键约束)有关会更好。

利用数据库服务器功能更好,还是不是为了这个目的?您是否建议在创建新记录之前进行所有完整性检查?

CREATE TABLE "public"."categories" (
"id" serial,
"name" varchar(100),
CONSTRAINT "categories__id_pkey" PRIMARY KEY ("id")
);

CREATE TABLE "public"."products" (
"id" serial,
"category_id" integer NOT NULL,
"name" varchar(100),
CONSTRAINT "products__id_pkey" PRIMARY KEY ("id"),
CONSTRAINT "products__category_id_fkey" FOREIGN KEY ("category_id")
REFERENCES "categories" ("id") ON DELETE CASCADE
);

伪代码:

if (query("SELECT * FROM categories WHERE id = 123"))
query("INSERT INTO products (category_id, name) VALUES (123, 'Something')")
else
throw Error("Parent record does not exist")

try
query("INSERT INTO products (category_id, name) VALUES (123, 'Something')")
catch (Exception e)
if (e.code == '23503')
throw Error("Parent record does not exist")
else
throw Error("Some other error occured")

PostgreSQL 中的错误代码 23503 是:


错误:插入或更新表“products”违反了外键约束“products__category_id_fkey”

最佳答案

Is it better to utilize database server capabilities, or it was not ment for this purpose

正是用于此目的。

只处理错误,否则你做的工作太多了。

如果您检查相关行的存在性,您只需复制工作,因为 PostgreSQL 也会这样做。

如果您不想关心插入行的顺序,您可以将约束声明为deferrable initially deferred。在这种情况下,当您提交您的事务时,所有相关行都必须存在,而不是在您运行每个语句时。这是一个简短的例子:http://sqlfiddle.com/#!12/33de1/1

在这种情况下,您需要在提交时处理错误,而不是在运行每个语句时。

关于sql - 处理 PostgreSQL 外键错误和。防止它们发生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13033115/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com