为 Postgres JSON 文档生成 UUID

Generate UUID for Postgres JSON document

我正在插入带有 JSON 文档的 Postgres table,我想为该文档生成一个唯一 ID。我自己当然可以,但是我想知道有没有办法让PG来做。

INSERT INTO test3 (data) VALUES ('{"key": "value", "unique": ????}')

文档似乎表明 JSON 记录适合各种 SQL 数据类型,但我不明白它是如何工作的。

只是串联怎么样?假设您的专栏是 json/jsonb 类型,类似下面的内容应该有效:

INSERT INTO test3 (data) VALUES (('{"key": "value", "unique": "' || uuid_generate_v4() || '"}')::jsonb)

如果您希望生成 UUID 并将其与 JSON 数据字段中的值同时存储,有些人可能会发现以下内容更明智:

WITH
    -- Create a temporary view named "new_entry" containing your data
    new_entry
        -- This is how you name the view's columns
        ("key", "unique")
    AS (
        VALUES
            -- This is the actual row returned by the view
            (
                'value',
                uuid_generate_v4()
            )
    )
INSERT INTO
    test3(
        data
    )
    SELECT
        -- Convert row to JSON. Column name = key, column value = value.
        ROW_TO_JSON(new_entry.*)
    FROM
        new_entry

首先,我们要创建一个名为 new_entry 的临时视图,其中包含要存储在 JSON 数据字段中的所有数据。

其次,我们获取该条目并将其传递给 ROW_TO_JSON 函数,该函数将其转换为有效的 JSON 数据类型。转换后,它会将行插入 test3 table.

我对“理智”的推理是,您的 JSON 对象很可能最终包含的不仅仅是两个 key/value 对...相反,您最终会得到一堆键和值,由你来确保你不会错过任何引号并适当地转义用户输入。当您可以让 Postgres 为您完成这些工作(在 ROW_TO_JSON() 的帮助下)同时又使其更易于阅读和调试时,为什么还要手动将所有这些粘合在一起?