postgresql 如何在Apache AGE中创建自动递增(串行)属性?

evrscar2  于 2023-06-29  发布在  PostgreSQL
关注(0)|答案(9)|浏览(126)

如何在Apache AGE中创建自动递增(串行)属性?
例如,在下面的查询中,我想添加一个新的属性order_id,它是唯一的,并且每次添加新订单时都会自动递增。

SELECT *
FROM cypher('online_orders', $$
    CREATE(:User{name:"user1" ,email : "test@test.com" , phone:"123456" });
$$) AS (result agtype)
txu3uszq

txu3uszq1#

由于节点和边的属性作为JSON对象存储在properties列中,我相信这不能仅通过openCypher语法实现。此外,AGE存储每个节点和边的ID,因此创建order_id属性可能是多余的。但你可以这样做:创建用户并将order_id属性设置为与节点id相同。

ukqbszuj

ukqbszuj2#

到目前为止,没有办法实现这一点与一些约束或功能.实现这一点的一种方法是创建一个触发器,该触发器查询当前的最高order_id并递增1
为触发器创建函数

CREATE OR REPLACE FUNCTION increment_order_id()
  RETURNS TRIGGER 
  LANGUAGE PLPGSQL
  AS
$$
DECLARE max_order_id INTEGER;
DECLARE current_order_id INTEGER;
BEGIN
   SELECT max(order_id) INTO max_order_id FROM online_orders;
   current_order_id := max_order_id + 1;
   UPDATE online_orders 
   SET order_id = max_order_id 
   WHERE order_id = 0;
   RETURN NEW;
END;
$$

创建触发器

CREATE TRIGGER autoincrement_order_id
AFTER INSERT ON online_orders
FOR EACH ROW
EXECUTE FUNCTION increment_order_id();

创建订单

SELECT *
FROM cypher('online_orders', $$
   CREATE(:User {name:"user1" ,email : "test@test.com" , phone:"123456", order_id: 0 });
$$) AS (result agtype)

每次创建订单时,请确保将order_id添加为0。

5vf7fwbs

5vf7fwbs3#

Apache AGE在其当前形式中不提供用于自动递增或串行属性的内置机制,就像传统关系数据库中一样。
但是,您可以通过实现自定义解决方案并编写自己的函数来实现自动增量。希望有帮助!

wqlqzqxt

wqlqzqxt4#

Apache AGE不提供对自动递增或串行属性的内置支持。我们可以根据需要定义节点和边的属性,但是对于自动增量,可以存在可以定义的定制逻辑。

uelo1irk

uelo1irk5#

AGE中不支持自动递增。你可以做的是为它定义一个自定义函数。
您可以在插入新记录之前获取最大的order_id,然后将其递增1,然后插入记录。
这样的东西可能会有帮助(未测试):

CREATE FUNCTION next_order_id() RETURNS INTEGER AS $$
  DECLARE
    max_id INTEGER;
    next_id INTEGER;
  BEGIN
    -- Get the maximum order_id from the existing records
    SELECT max(order_id) INTO max_id FROM online_orders;

    -- If there are no existing records, start with an initial value of 1
    IF max_id IS NULL THEN
      next_id := 1;
    ELSE
      next_id := max_id + 1;
    END IF;

    RETURN next_id;
  END;
$$ LANGUAGE plpgsql;
lo8azlld

lo8azlld6#

正如有人已经提到的,auto_increment不可用,它将在下一个版本中实现。我们现在可以做的是定义一个自定义逻辑,通过它我们可以在节点中保留最新的order_id的值,并且每当我们输入新的订单数据时,我们都会不断更新它。这样,我们的每个订单数据都有一个唯一的订单ID。
你也可以在apache age中编写自定义函数:
您可以从以下文档中获得有关用户定义函数的说明:
User Defined Functions
你也可以在GitHub上提出这个问题,以便尽快开始工作。
Apache Age Issue

8tntrjer

8tntrjer7#

我认为这是不支持的,但你可以尝试做的是创建一个单独的数据库表来创建自动递增的ID,你将需要实现一个混合查询,每当你创建一个新节点,在IDs表中创建一个新行,该行包含一个列,以便您可以轻松地引用回节点(这不是最好的选择)或者更好的选择是在表中创建一行,然后获取ID值并将其存储在新节点中,这就是你确保每次创建新节点时都有一个唯一的ID。
我希望这有助于您了解如何实现它。

roqulrg3

roqulrg38#

为了实现这一点,您必须定义一些自定义逻辑,因为当前自动增量方法不可用。

k3fezbri

k3fezbri9#

目前在Apache AGE中还不支持属性的自动递增,但是您可以实现一个用户定义的函数来实现这一点。

相关问题