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

时间:2008-10-15 15:33:20

标签: mysql sql mysql-error-1093

显然,以下内容不正确。

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 个答案:

答案 0 :(得分:12)

尝试:

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

答案 1 :(得分:8)

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

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

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

答案 2 :(得分:5)

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

  

INSERT的目标表   语句可能出现在FROM中   SELECT部分​​的子句   查询。 (有些人不可能这样做   旧版本的MySQL。)在此   例如,MySQL创建了一个临时表   从SELECT和中保存行   然后将这些行插入到   目标表。

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

答案 3 :(得分:1)

我认为你需要删除“VALUES”,并且有一个有效的select语句。

see this link

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

答案 4 :(得分:-1)

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