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

Posted

技术标签:

【中文标题】从与插入或更新相同的表中选择【英文标题】:Select from same table as an Insert or Update 【发布时间】:2010-09-17 08:07:57 【问题描述】:

显然以下是不正确的。

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,我的错误,请注意这就是为什么cmets经常说^2,这是版本的错误评论者阅读。

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

尝试:

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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

下一个建议是,如果您使用的是旧版本的 MySQL,请使用临时表,这是当前版本的 MySQL 隐式执行的操作。 ..它应该可以工作 # 服务器版本:5.0.45-Debian_1ubuntu3.3-log # 协议版本:10【参考方案4】:

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

【讨论】:

【参考方案5】:

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

see this link

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

【讨论】:

不,我正在尝试从与插入相同的表中进行选择,而 MySQL 不喜欢这样。抱歉,我第一次没有正确输入查询,但是选择仍然正确。 人力资源管理。好的,mySQL 有用户定义的函数吗?所以你可以创建一个返回当前“MAX(A)”的函数并在你的语句中使用它? 它确实(存储过程),但我不确定它是否会让你仍然这样做。值得一试 我正在看这些 cmets,试试看,如果它有效,请告诉我。如果没有,我会在午餐时在我的本地 mySQL 上设置一些类似的表,并尝试看看我是否可以得到一些工作,如果没有更好的 mySQL 知识的人还没有得到答案。 人力资源部。由于无法使用 mySQL,我无法提出令人满意的解决方案。在我看来,mySQL 缺乏 MSSQL 所具有的某些功能,但这可能是我在该 dbms 方面的经验不足。

以上是关于从与插入或更新相同的表中选择的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法将此插入合并到选择查询中?

MySQL 在从另一个表中选择时插入到具有自动增量的表中

Redshift 复制命令追加、替换或更新插入?

如何通过mysql或python将数据插入到另一个具有相同id的表中

如何使用查询或 VBA 和 SQL 更新 MS ACCESS 中的表

如果 mysql 数据库中的表中不存在,则更新或插入多条记录