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' 进行更新

所以,我正在尝试制作一个位图表,每一行对应一个位,并且有一个“地图”值。

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

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

4

5 回答 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;

我的“服务器版本”是“5.0.51b-community-nt MySQL 社区版(GPL)”

于 2008-10-15T18:22:20.627 回答
10

实际上,您可以在插入时为表设置别名。我到处都看到过这个问题,但似乎没有人尝试过。使用子查询从表中获取最大值,但在子查询中为表设置别名。

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);

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

于 2011-10-31T22:42:52.430 回答
5

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

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

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

于 2008-10-15T15:47:27.070 回答
2

我认为您需要删除“VALUES”,并有一个有效的选择语句。

看到这个链接

我不是特别喜欢 mySQL 的人,我主要使用 MSSQL。但是,如果您正确格式化 select 语句,它应该可以工作。

于 2008-10-15T15:35:43.193 回答
-3

只要选择正确,您就可以执行此操作。

于 2008-10-15T15:42:48.577 回答