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'
数据来得到新的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
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';
我想进一步详细说明这里提出的一个问题- 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'
数据来得到新的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
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';