与插入或更新相同表中选择数据

12

显然,以下内容是不正确的。

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的原因,那是评论者看到的版本中的错误。

5个回答

17

尝试:

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;

我的"Server version"是 "5.0.51b-community-nt MySQL Community Edition (GPL)"


11

实际上,在插入时可以给表取别名。我在很多地方看到了这个问题,但似乎没有人尝试过。使用子查询从表中获取最大值,但在子查询中给表取别名。

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

一个更复杂的例子,其中你有一个对应的次要键,并且可能正在插入对应次要键的第一条记录:

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

通过给表起别名,它不会抛出错误并且似乎可以工作。我在编写代码时就是这样做的,虽然我看不到上面是否有任何愚蠢的语法错误,但我会尝试这种类型的语法。


5
我猜您使用的是MySQL数据库,想要使用INSERT ... SELECT功能但遇到问题了。根据文档描述,如果SELECT查询语句中的FROM子句中包含了目标表,MySQL会创建一个临时表来存储SELECT语句中的数据,并将这些数据插入到目标表中。请问您使用的是哪个版本的MySQL?

下一个建议是,如果您正在使用旧版本的MySQL,请使用临时表,这是当前版本的MySQL隐式执行的操作。 - Bill Karwin
应该可以正常运作。

服务器版本:5.0.45-Debian_1ubuntu3.3-log

协议版本:10

- Issac Kelly

2
我认为你需要去掉“VALUES”,并使用一个有效的SELECT语句。
请查看此链接
我不是特别擅长MySQL,我主要使用MSSQL。但是如果你正确格式化SELECT语句,它应该可以工作。

不,我正在尝试从与插入相同的表中进行选择,但MySQL不喜欢那样做。 抱歉,第一次我没有正确输入查询,但选择仍然是正确的。 - Issac Kelly
嗯,好的,mySQL有用户定义函数吗?这样你就可以创建一个返回当前“MAX(A)”的函数,并在语句中使用它了吗? - stephenbayer
它确实可以(存储过程),但我不确定它是否仍然允许你这样做。值得一试。 - Issac Kelly
我正在关注这些评论,请尝试并让我知道它是否有效。如果没有,我将在午餐时在我的本地mySQL上设置一些类似的表格,并尝试看看是否可以得到一些有效的结果,如果没有更好的mySQL知识的人还没有答案的话。 - stephenbayer
哎呀,由于我无法使用mySQL,我无法提供令人满意的解决方案。在我看来,mySQL似乎缺乏MSSQL拥有的某些能力,但这可能只是因为我对该数据库管理系统缺乏经验。 - stephenbayer

-5

一旦选择正确,你就可以这样做。


到目前为止,这是我最喜欢的答案。 - Arman Bimatov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接