当前位置:  开发笔记 > 后端 > 正文

从插入或更新的同一表中选择

如何解决《从插入或更新的同一表中选择》经验,为你挑选了3个好方法。

显然以下是不正确的.

INSERT INTO `aTable` (`A`,`B`) VALUES((SELECT MAX(`A`) FROM `aTable`)*2),'name');

我得到的价值:

SQL查询:

INSERT INTO `aTable` (`A`, `B` )
VALUES 
(
  (
   SELECT MAX(`A`)
   FROM `aTable`
  ) *2
 , 'name'
)

MySQL说:

1093 - 您无法在FROM子句中为更新指定目标表'aTable'

所以,我正在尝试制作一个位图表,每行对应一位,并具有"map"值.

要在表中插入,我不想做两个查询,我想做一个.我该怎么做?

没有人对此发表评论,但由于我正在尝试制作位图,它应该是*2而不是^ 2,我的错误,请注意这就是为什么评论经常说^ 2,这是评论者的版本中的错误读.



1> Leonel Marti..:

尝试:

insert into aTable select max(a)^2, 'name' from aTable;

要么

insert into aTable select max(a)^2, 'name' from aTable group by B;

如果您需要加入,您可以这样做:

insert into aTable select max(a)^2, 'name' from aTable, bTable;

我的"服务器版本"是"5.0.51b-community-nt MySQL Community Edition(GPL)"



2> 小智..:

实际上,您可以在插入上对表进行别名.我到处都看到过这个问题,但似乎没人试过.使用子查询从表中获取最大值,但使用子查询中的表作为别名.

INSERT INTO tableA SET fieldA = (SELECT max(x.fieldA) FROM tableA x)+1;

一个更复杂的示例,其中您具有相应的辅助密钥,并且可能正在插入相应辅助密钥的FIRST记录:

INSERT INTO tableA SET secondaryKey = 123, fieldA = COALESCE((SELECT max(x.fieldA) FROM tableA x WHERE x.secondaryKey = 123)+1,1);

通过别名表,它不会抛出错误,似乎工作.我只是在编写代码时执行此操作,虽然我无法查看上面是否存在任何愚蠢的语法错误,但我会尝试这种类型的语法.



3> Powerlord..:

我认为INSERT ... SELECT不起作用?我在文档中看到了这个:

INSERT语句的目标表可能出现在查询的SELECT部分​​的FROM子句中.(这在某些旧版本的MySQL中是不可能的.)在这种情况下,MySQL创建一个临时表来保存SELECT中的行,然后将这些行插入到目标表中.

出于好奇,您使用的是哪个版本的MySQL?

推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有