gpt4 book ai didi

sql - PostgreSQL - 修改扩展中的 CREATE TABLE 语法

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

是否可以编写修改 DDL 语法的 PostgreSQL 扩展?

我正在 PostgreSQL 和 PostGIS 之上创建一个扩展,以支持特定空间数据模型 (OMT-G) 的完整性约束。为此,我想修改 CREATE TABLE 语法,它接受具有以下语法的 CONSTRAINTS:

CONSTRAINT constraint_name CHECK ( expression )

但我想创建自己的语法,如以下示例中的语法,然后将调用我已经编写的函数或触发器。

CREATE TABLE school_district (
id integer PRIMARY KEY,
school_name varchar(120)
geom geometry,

SPATIAL_CONSTRAINT PLANAR_SUBDIVISION (geom),
SPATIAL_CONSTRAINT CONTAINS school (geom)**
);

这可能吗?如果是,怎么办?

最佳答案

正如其他人评论的那样,不可能通过扩展来改变 Postgres 语法。在黑客的邮件列表上有一些与此相关的讨论,但没有人看到任何使 Bison 语法可扩展的可行方法。

您提议的另一个问题是 CHECK 约束(看起来是您在这里尝试做的)不能安全地引用其他表。

听起来您真正想要的是可扩展的外键支持。这也是社区实际上想要的东西,至少对于数组而言。这个想法是支持像 int[] 这样的东西,其中每个元素都应该被视为对另一个表的外键引用。您所描述的是相似的:您想要使用不同的运算符而不是不同的数据类型。

不过现在,我认为您能做的最好的事情就是为您的用户提供一个函数,该函数会在表中放置适当的列和触发器。该列将是学校表的外键。触发器会找到合适的学校并在新列中填充它的主键。 (您可能希望学校表上有一个 BEFORE DELETE 触发器来处理删除学校的问题。)

您需要外键字段的原因是因为外键触发器以不同于普通查询的可见性规则运行,因此您无法在用户空间中完全模拟它们。如果您不是那么偏执,您可以只使用一个 AFTER INSERT 触发器来查找学校并在找不到学校时抛出错误。

关于sql - PostgreSQL - 修改扩展中的 CREATE TABLE 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35659830/

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