вставлять в базу данных, только если id не существует - PullRequest
1 голос
/ 27 мая 2020

Я использую Postgres. В моем коде ниже я хочу вставить в базу данных, только если id еще не существует.

DROP TABLE json_table;
CREATE temp TABLE json_table (
    id VARCHAR(50) PRIMARY KEY,
    str_col VARCHAR(500),
    int_col SMALLINT,
    bool_col BOOLEAN,
    json_col JSON,
    float_col DECIMAL
);
INSERT INTO json_table
    SELECT * FROM json_populate_recordset (NULL::json_table,
     '{ "insert": [
        {
          "id": "1",
          "str_col": "Postgres bar data",
          "int_col": 3151,
          "bool_col": false,
          "json_col": {
            "data": "tutorials"
          },
          "float_col": 11.51099159756918
        },
        {
          "id": "2",
          "str_col": "Postgres tutorials data data",
          "int_col": 4237,
          "bool_col": true,
          "json_col": {
              "type": "type"
          },
          "float_col": 48.94065780742467
        }
      ]}'::json->'insert');
SELECT * FROM json_table;

Ответы [ 2 ]

0 голосов
/ 27 мая 2020

Вы можете использовать предложение on conflict do nothing. Ваш столбец id является первичным ключом таблицы, поэтому это будет работать:

INSERT INTO json_table
SELECT * 
FROM json_populate_recordset (NULL::json_table,
     '{ "insert": [
        {
          "id": "1",
          "str_col": "Postgres bar data",
          "int_col": 3151,
          "bool_col": false,
          "json_col": {
            "data": "tutorials"
          },
          "float_col": 11.51099159756918
        },
        {
          "id": "2",
          "str_col": "Postgres tutorials data data",
          "int_col": 4237,
          "bool_col": true,
          "json_col": {
              "type": "type"
          },
          "float_col": 48.94065780742467
        }
      ]}'::json->'insert')
ON CONFLICT (id) DO NOTHING;

Демо на DB Fiddle

Допустим, эта запись была вставлена ​​раньше:

insert into json_table(id) values(1)

Вышеупомянутый запрос выполняется без ошибок и вставляет только вторую строку.

0 голосов
/ 27 мая 2020

Определите уникальное ограничение для id:

alter table t add constraint unq_json_table_id unique(id);

Затем вы можете вставить, используя on conflict:

insert into json_table . . .
     . . . 
     on conflict (id) do nothing;
...