SQL多行插入,从不同表中进行多次选择

SQL多行插入,从不同表中进行多次选择,sql,oracle,Sql,Oracle,我正在尝试根据从另一个表中提取的值进行多重插入。基本上,我需要让所有现有用户都能访问一个以前可以访问另一个服务的服务。表1将获取数据并运行一个作业来执行此操作 INSERT INTO Table1 (id, serv_id, clnt_alias_id, serv_cat_rqst_stat) SELECT (SELECT Max(id) + 1 FROM Table1 ), '33', --The new service id clnt_alias_id, 'P

我正在尝试根据从另一个表中提取的值进行多重插入。基本上,我需要让所有现有用户都能访问一个以前可以访问另一个服务的服务。表1将获取数据并运行一个作业来执行此操作

   INSERT INTO Table1 (id, serv_id, clnt_alias_id, serv_cat_rqst_stat)
SELECT
  (SELECT Max(id) + 1
     FROM Table1 ),
  '33', --The new service id
  clnt_alias_id,
  'PI' --The code to let the job know to grant access
FROM TABLE2,
WHERE serv_id = '11' --The old service id
我在id上遇到主键约束错误

请帮忙

谢谢,
科林

这个查询是不可能的。max(id)子选择将只计算一次,并为父查询中的所有行返回相同的值:

MariaDB [test]> create table foo (x int);
MariaDB [test]> insert into foo values (1), (2), (3);
MariaDB [test]> select *, (select max(x)+1 from foo) from foo;
+------+----------------------------+
| x    | (select max(x)+1 from foo) |
+------+----------------------------+
|    1 |                          4 |
|    2 |                          4 |
|    3 |                          4 |
+------+----------------------------+
3 rows in set (0.04 sec)

您必须多次运行查询,每次尝试复制记录一次。这样,max(id)将从前面的查询中获取id。

是否要求Table1.id为增量整数?如果没有,只需将clnt\u别名\u id添加到Max(id)。不过,这是一个令人讨厌的解决方法,您应该尝试将该列的类型更改为自动增量,就像Marc B建议的那样。

不要执行
选择max(id)+1
。只需将ID设置为自动增量主键,并让mysql为您生成值。此代码受竞争条件的约束,任何东西都不会阻止其他并行查询获得相同的最大(id)值并生成重复的id。我无权更改表的该参数,并且更改请求将花费比设置这些项的截止日期更长的时间。