SQL 插入最大 ID + 1(深度)

SQL Insert with max ID + 1 (In-Depth)

我想进一步详细说明这里提出的一个问题- Insert and set value with max()+1 problems

假设我们从相同的场景开始解决方案:

INSERT INTO 
customers( customer_id, firstname, surname )
SELECT MAX( customer_id ) + 1, 'jim', 'sock' FROM customers

再说一下,整个袜子家族都是这家店的顾客。为了这个问题,假设有 10 个独特的 firstname 也都有自己独特的 customer_id,但他们都有相同的姓氏 'sock'.

我想做的是说 Big Papa Sock 进来了,想用他的新姓氏 ('shoe') 复制他的整个家庭,对于每个条目,我们需要一个新的唯一 customer_id(即最高电流的+1 customer_id)。

所以我们目前在模拟中的数据 customers table 是-

customer_id   firstname   surname
          1         jim      sock
          2         sue      sock
          3        brad      sock
          4        tony      sock
          5        paul      sock
          6       betty      sock
          7       allen      sock
          8        rita      sock
          9         pam      sock
         10         deb      sock

我想插入新的'shoe'数据来得到新的customerstable-

customer_id   firstname   surname
          1         jim      sock
          2         sue      sock
          3        brad      sock
          4        tony      sock
          5        paul      sock
          6       betty      sock
          7       allen      sock
          8        rita      sock
          9         pam      sock
         10         deb      sock
         11         jim      shoe
         12         sue      shoe
         13        brad      shoe
         14        tony      shoe
         15        paul      shoe
         16       betty      shoe
         17       allen      shoe
         18        rita      shoe
         19         pam      shoe
         20         deb      shoe

所以基本上我需要它做的是复制唯一条目的每个组合并插入到客户中。所以它应该保持 firstname 相同,但根据最大值 customer_id+1 和新的 surname'shoe'

添加一个新条目

到目前为止我尝试过的是-

INSERT INTO 
customers(customer_id, firstname, surname) 
SELECT MAX(customer_id) + 1, firstname, 'shoe' FROM customers 
WHERE surname = 'sock'

但是插入的时候好像出错了

如有任何帮助,我们将不胜感激。

如果出于某种原因无法选择自动递增的列,请尝试

INSERT INTO customers(customer_id, firstname, surname)
SELECT MAX(customer_id) over()
   + row_number() over(order by customer_id), firstname, 'shoe' 
FROM customers;

这取决于竞争条件,你知道的。

编辑

另一种选择是先找到最大值

SET @m = (SELECT MAX(customer_id) FROM customers);
INSERT INTO customers(customer_id, firstname, surname)
SELECT @m
   + row_number() over(order by customer_id), firstname, 'tie' 
FROM customers
WHERE surname = 'sock';

db<>fiddle