如何在 MonetDB 中正确实现 AUTO_INCREMENT?
How to implement AUTO_INCREMENT properly in MonetDB?
我有两个 MonetDB table 使用 auto-increment 为每一行生成唯一的 ID。 child table 中的每一行引用 parent table 中的一行(建模 1:n 关系):
CREATE SEQUENCE "test"."seq_parent" as integer START WITH 1;
CREATE TABLE "test"."parent" (
"id" INT NOT NULL DEFAULT next value for "test"."seq_parent",
"name" STRING,
PRIMARY KEY ("id")
);
CREATE SEQUENCE "test"."seq_child" as integer START WITH 1;
CREATE TABLE "test"."child" (
"id" INT NOT NULL DEFAULT next value for "test"."seq_child",
"parent_id" INT NOT NULL,
"name" STRING,
PRIMARY KEY ("id")
);
当我导入 (parent, child_1, …, child_n) 元组到这个数据库时,我首先需要 INSERT
parent 和然后 INSERT
所有 children 使用我刚刚创建的 parent 的 ID。
现在的问题是:如何获取我刚刚INSERTed
的行的ID?在 MySQL 中,有 LAST_INSERT_ID()
。但是,我在 MonetDB 中找不到类似的东西。
我尝试了 SELECT next value for "test"."seq_parent"
,它给出了一个 ID,但同时增加了序列。我也在执行 INSERT
后立即尝试 SELECT MAX("id") FROM "test"."parent"
,但这很脆弱,因为如果连接了另一个客户端并将数据插入 parent,它就会中断table同时
如果您可以使用应用程序代码,请使用它。首先 运行 从 seq_parent 获取下一个值的查询。然后将其设置为一个变量。然后在所有相关的插入命令中使用该变量。
我有两个 MonetDB table 使用 auto-increment 为每一行生成唯一的 ID。 child table 中的每一行引用 parent table 中的一行(建模 1:n 关系):
CREATE SEQUENCE "test"."seq_parent" as integer START WITH 1;
CREATE TABLE "test"."parent" (
"id" INT NOT NULL DEFAULT next value for "test"."seq_parent",
"name" STRING,
PRIMARY KEY ("id")
);
CREATE SEQUENCE "test"."seq_child" as integer START WITH 1;
CREATE TABLE "test"."child" (
"id" INT NOT NULL DEFAULT next value for "test"."seq_child",
"parent_id" INT NOT NULL,
"name" STRING,
PRIMARY KEY ("id")
);
当我导入 (parent, child_1, …, child_n) 元组到这个数据库时,我首先需要 INSERT
parent 和然后 INSERT
所有 children 使用我刚刚创建的 parent 的 ID。
现在的问题是:如何获取我刚刚INSERTed
的行的ID?在 MySQL 中,有 LAST_INSERT_ID()
。但是,我在 MonetDB 中找不到类似的东西。
我尝试了 SELECT next value for "test"."seq_parent"
,它给出了一个 ID,但同时增加了序列。我也在执行 INSERT
后立即尝试 SELECT MAX("id") FROM "test"."parent"
,但这很脆弱,因为如果连接了另一个客户端并将数据插入 parent,它就会中断table同时
如果您可以使用应用程序代码,请使用它。首先 运行 从 seq_parent 获取下一个值的查询。然后将其设置为一个变量。然后在所有相关的插入命令中使用该变量。