Нужно пакетно вставить с внешним ключом - PullRequest
0 голосов
/ 02 октября 2019

В настоящее время я использую CockroachDB и мне нужно пакетно вставить код категории магазина.

Вот моя текущая схема таблицы

CREATE TABLE storecategorycode(
  id                        UUID            PRIMARY KEY DEFAULT gen_random_uuid(),
  isenabled                 BOOLEAN         NOT NULL
);

CREATE TABLE storecategorycodeml(
  id                        UUID            PRIMARY KEY DEFAULT 
  gen_random_uuid(),
  storecategorycode_id      UUID            NOT NULL,
  category1                 VARCHAR(255)    NULL,
  category2                 VARCHAR(255)    NULL,
  category3                 VARCHAR(255)    NULL,
  category4                 VARCHAR(255)    NULL,
  category5                 VARCHAR(255)    NULL,
  lang                      VARCHAR(25)     NOT NULL,
  CONSTRAINT storecategorycodeml_ibfk_1 FOREIGN KEY (storecategorycode_id)   
    REFERENCES storecategorycode(id) ON DELETE CASCADE
);

storecategorycodeml («ml» означает «многоязычный»)) зависит от внешнего ключа storecategorycode_id.

Как вставить что-то подобное?

INSERT INTO storecategorycodeml 
(storecategorycode_id, category1, category2, category3, category4, category5, lang) 
VALUES (
  INSERT INTO storecategorycode(isenabled) VALUES(true) 
  RETURNING id,'Restaurant','Restaurant-1','Cafe','In-store','takeout','en'
);

'RETURNING id' - это синтаксис, используемый в cockroachDB для возврата вставленного идентификатора.

Я могу создать сценарий, чтобы вручную сначала создать запись в storecategorycode и создать запись в storecategorycodeml, но Я буду вставлять тысячи записей , и я предпочитаю не кодировать их вручную.

FYI,причина, по которой у меня есть отдельная таблица, заключается в поддержке нескольких языков. Например, у меня может быть код storecategory (001, true), а 001 может иметь несколько языков, таких как английский, корейский, китайский и т. Д.

1 Ответ

1 голос
/ 02 октября 2019

Я не знаю, поддерживает ли ваша СУБД этот цепочечный синтаксис INSERT, но стоит попробовать:

WITH inserted AS (
  INSERT INTO storecategorycode(isenabled) VALUES(true) 
  RETURNING id
)
INSERT INTO storecategorycodeml 
(storecategorycode_id, category1, category2, category3, category4, category5, lang) 
SELECT id, 'Restaurant','Restaurant-1','Cafe','In-store','takeout','en'
FROM inserted
;

Это сначала сделает INSERT в storecategorycode, а затем вернетid значение и позволит вам ссылаться на него в последующем INSERT.

...