【问题标题】:SQL: insert multiple rows at onceSQL:一次插入多行
【发布时间】:2019-06-15 12:04:02
【问题描述】:

我有一个这样的值数组(restaurant_id 不是主键):

[
{restaurant_id:1, day_of_week:0, from_time: "12:00", to_time: "14:00", is_open:false },
{restaurant_id:1, day_of_week:1, from_time: "12:00", to_time: "14:00", is_open:true },
{restaurant_id:1, day_of_week:2, from_time: "12:00", to_time: "14:00", is_open:true },
...
]

每天一个条目。

我想将它们中的每一个都保存为 PostgreSQL 数据库中的新行。

我有一个插入查询:

INSERT INTO schedules (restaurant_id, day_of_week, from_time, to_time, is_open) VALUES ($1, $2, $3, $4, $5) RETURNING schedules;

我应该执行 7 个 INSERT 语句还是可以循环并在一个语句中保存所有语句?

循环的查询是什么?

编辑:

所以我可以按照建议在一个查询中做这样的事情:

 VALUES (?, ?, ?, ? ?),
        (?, ?, ?, ? ?),
        (?, ?, ?, ? ?),
        (?, ?, ?, ? ?),
        (?, ?, ?, ? ?),
        (?, ?, ?, ? ?),
        (?, ?, ?, ? ?)

但是有没有更好的方法呢?

【问题讨论】:

  • 我假设您也使用了某种编程语言,正如您提到的那样“循环的查询是什么?”

标签: sql postgresql


【解决方案1】:

如果所有其他值都是常量(或可从 running 变量中导出),您可以使用generate_series()


INSERT INTO schedules (restaurant_id, day_of_week
           , from_time, to_time, is_open) 
SELECT 1, gs, '10:00','22:00', True
FROM generate_series(0,6) gs
        ;

generate_series 的文档 https://www.postgresql.org/docs/11/functions-srf.html

【讨论】:

  • 这是 postgres 特有的功能吗?
  • 是的。 Generate_series() 是一个 postgres 扩展。
【解决方案2】:

如果这些输入值实际上是 JSON 数组的一部分,您可以直接使用它:

INSERT INTO schedules (restaurant_id, day_of_week, from_time, to_time, is_open) 
select (v ->> 'restaurant_id')::int, 
       (v ->> 'day_of_week')::int,
       (v ->> 'from_time')::time,
       (v ->> 'to_time')::time,
       (v ->> 'is_open')::boolean
from jsonb_array_elements('
[
  {"restaurant_id":1, "day_of_week":0, "from_time": "12:00", "to_time": "14:00", "is_open":"false" },
  {"restaurant_id":1, "day_of_week":1, "from_time": "12:00", "to_time": "14:00", "is_open":"true" },
  {"restaurant_id":1, "day_of_week":2, "from_time": "12:00", "to_time": "14:00", "is_open":"true" }
]'::jsonb) as t(v);

当然,您需要将硬编码的字符串值替换为适当的参数,例如from jsonb_array_elements(cast(? as jsonb))

【讨论】:

    【解决方案3】:

    您可以发出一张插页。我建议使用参数:

    INSERT INTO schedules (restaurant_id, day_of_week, from_time, to_time, is_open)
        VALUES (?, ?, ?, ? ?),
               (?, ?, ?, ? ?),
               . . .
        RETURNING *;
    

    【讨论】:

    • 啊,是的!为每一行显式设置 VALUES 比遍历数组更好吗?
    【解决方案4】:

    插入用户(id、姓名、年龄) 价值观 (1, 'Talha', 22), (2,“约翰”,41), (3, '威廉', 32);

    我猜这会起作用。

    【讨论】:

    • 是的,我只是想知道我是否可以循环并避免写(1, 'Talha', 22), 7 次...
    • Kevin Amiranoff,您可以使用 mysql 的存储过程。 begin for i in 1 .. 100000 循环插入用户值 (i, 'Talha' ,20+i);结束循环;犯罪;结束;
    【解决方案5】:

    凯文·阿米拉诺夫, 你可以使用mysql的存储过程。

    开始 对于我在 1 .. 100000 环形 插入用户值(i,'Talha',20+i); 结束循环; 犯罪; 结束;

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-20
    • 2015-05-31
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多