英文:
On PostgreSQL, how can I alter a table to make it an inheritor from multiple parents?
问题
我正在开发一个在 Apache AGE 扩展中用 C 语言创建函数的功能,该功能执行 ALTER TABLE 命令以继承自父表。
根据 PostgreSQL 文档的 CREATE TABLE 部分,INHERITS 关键字可以接受父表的列表。然而,在 ALTER TABLE 的文档中,只提到了使用语法 INHERIT parent_table 继承单个父表。
我的问题是在 PostgreSQL 中是否可以使用 ALTER TABLE 命令继承来自父表列表的内容。如果可以,实现这一目标的正确语法是什么?附注:我正在使用 PostgreSQL 的版本 11。
这是我正在创建的函数(它没有运行,系统意外关闭):
英文:
I am working on creating a function in C-language in Apache AGE extension that performs an ALTER TABLE command to inherit from a parent table.
According to the PostgreSQL documentation for CREATE TABLE, the INHERITS keyword can take a list of parent tables. However, in the documentation for ALTER TABLE, it only mentions inheriting from a single parent table using the syntax INHERIT parent_table.
My question is whether it's possible to inherit from a list of parent tables using the ALTER TABLE command in PostgreSQL. If so, what would be the correct syntax to achieve this? PS: I'm using the version 11 of PostgreSQL.
Here's the function I'm creating (it's not working, system shutting down unexpectedly)
static void alter_table_inherit(char *graph_name, char *label_name,
char *schema_name, char *seq_name,
Oid relid, List* parents)
{
ParseState *pstate;
AlterTableStmt *tbl_stmt;
AlterTableCmd *tbl_cmd;
RangeVar *rv;
/* RangeVar represents the table being altered */
rv = makeRangeVar(schema_name, label_name, -1);
pstate = make_parsestate(NULL);
pstate->p_sourcetext = "(generated ALTER TABLE command)";
tbl_stmt = makeNode(AlterTableStmt);
tbl_stmt->relation = rv;
tbl_stmt->missing_ok = false;
tbl_cmd = makeNode(AlterTableCmd);
tbl_cmd->subtype = AT_AddInherit;
tbl_cmd->def = (Node *) parents;
tbl_stmt->cmds = lappend(tbl_stmt->cmds, tbl_cmd);
tbl_stmt->cmds = list_make1(tbl_cmd);
AlterTable(relid, AccessExclusiveLock, tbl_stmt);
CommandCounterIncrement();
}
答案1
得分: 2
你可以像这样添加多重继承父类:
ALTER TABLE tab
INHERIT parent1,
INHERIT parent2;
在C语言中,这将导致AlterTableStmt
,其中cmds
将是一个由两个AlterTableCmd
组成的List*
,分别对应每个父表。不要将tbl_cmd->def
设置为List*
!
我注意到的另一件事是你没有设置tbl_stmt->objtype
,所以它可能被设置为OBJECT_ACCESS_METHOD
,这是不正确的。
可能更简单的方法是使用SPI接口来执行SQL语句。
我不会使用旧版本的PostgreSQL,比如v11进行开发。如果Apache Age不支持更多更新的版本,请放弃它。
英文:
You can add multiple inheritance parents like this:
ALTER TABLE tab
INHERIT parent1,
INHERIT parent2;
In C, that will result in an AlterTableStmt
, where cmds
will be a List*
consisting of two AlterTableCmd
, one for each parent table. Don't set tbl_cmd->def
to a List*
!
Another thing that I notice is that you didn't set tbl_stmt->objtype
, so it is probably set to OBJECT_ACCESS_METHOD
, which is not correct.
It might be simpler to use the SPI interface to execute SQL statements.
I would not develop with an old PostgreSQL version like v11. If Apache Age doesn't support anything more recent, abandon it.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论