【问题标题】:Need to batch INSERT with foreign key需要用外键批量插入
【发布时间】:2019-10-02 06:31:02
【问题描述】:

我目前正在使用 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 中用于返回插入的 id 的语法。

我可以创建一个脚本来手动先在 storecategorycode 中创建记录,然后在 storecategorycodeml 中创建记录,但我将插入数千条记录,我不想手动编写这些代码。

仅供参考,我之所以有单独的表格是为了支持多语言。例如,我可以有一个 storecategorycode(001, true),而 001 可以有多种语言,例如英语、韩语、中文等。

【问题讨论】:

    标签: sql relational-database cockroachdb


    【解决方案1】:

    我不知道您的 DBMS 是否支持这种链式 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 中引用它。

    【讨论】:

    • 非常感谢。我会试试这个。我需要插入大约 5000 个商店类别代码。这是否意味着我需要编写上述查询 5000 次?我确实知道我可能可以编写一个 python 脚本来循环这些,但想知道是否有办法做。插入 () 值 (), (), () .... ();
    • 不客气。我不确定 CockroachDB 是如何工作的,但在其他数据库(即 Postgres)中,您可以使用多行来完成。试一试看看:)
    猜你喜欢
    • 2013-07-13
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    相关资源
    最近更新 更多