【问题标题】:Mysql - You can't specify target table for update in FROM clause - Subquery misunderstanding?Mysql - 您不能在 FROM 子句中指定要更新的目标表 - 子查询误解?
【发布时间】:2019-11-16 09:06:48
【问题描述】:

我被困在为学校 atm 做一个项目。老师们几乎没有向我们解释 SQL。

所以我有一个简单的表:

CREATE TABLE  `VINOVOLUPTATEM`.`TimeWorked` 
(
    `TimeID` INT NOT NULL AUTO_INCREMENT,
    `MNr` INT NOT NULL,
    `Start` TIMESTAMP NOT NULL,
    `End` TIMESTAMP NULL,
    `TotalTime` DOUBLE NULL,

    PRIMARY KEY (`TimeID`),
    FOREIGN KEY (MNr) REFERENCES employees (MNr)
);

该表用于跟踪所有员工的工作时间。

如果我尝试使用以下方法将数据输入到表中:

INSERT INTO TimeWorked (MNr, Start, End, TotalTime)
VALUES (0002,'2019-06-30 08:30:00', '2019-06-30 17:00:00', '8.5');

它工作得很好,但是当我尝试使用这个来自动化“TotalTime”时:

INSERT INTO TimeWorked (MNr, Start, End, TotalTime)
VALUES (0001,'2019-06-30 15:00:00', '2019-06-30 18:30:00', 
(TIMESTAMPDIFF(HOUR,(SELECT Start FROM TimeWorked WHERE TimeID = (SELECT MAX(TimeID) FROM TimeWorked)) , 
(SELECT End FROM (SELECT End FROM TimeWorked WHERE TimeID = (SELECT MAX(TimeID) FROM TimeWorked)) AS End)
)));

我不断收到错误:

错误代码:1093。您不能在 FROM 子句中指定目标表 'arbeitszeit' 进行更新

我已经在这里查看了不同的帖子,这似乎与 MySQL 的子查询限制有关。但是我在这里找不到我的错误。

我必须做些什么来更正查询?

注意:为了方便起见,我将部分名称翻译成英文。真实表中的名称不代表任何语句。

【问题讨论】:

  • 您不应该在insert 上收到该错误。你桌上有触发器吗?
  • @Gordon Linoff 不完全确定触发器是如何工作的,但我查了一下并没有指定任何触发器。除了此处显示的代码之外,没有其他代码链接到此表。
  • 您的查询中的arbeitszeit 表在哪里?那是TimeWorked的真名吗?
  • @GordonLinoff 我刚刚在测试表上重现了错误。
  • @Kazzed:如果您关心的是从开始到结束自动计算时间,您可以在创建时插入一个虚拟值,然后运行更新,例如 update TimeWorked set TotalTime=TIMESTAMPDIFF(HOUR,结束,开始)或类似的东西

标签: mysql sql subquery mysql-error-1093


【解决方案1】:

不要将SELECT 放在VALUES 列表中,使用INSERT ... SELECT

INSERT INTO TimeWorked (MNr, Start, End, TotalTime)
SELECT 0001,'2019-06-30 15:00:00', '2019-06-30 18:30:00', TIMESTAMPDIFF(HOUR, Start, End)
FROM TimeWorked
ORDER BY TimeId DESC
LIMIT 1

这类似于在尝试执行UPDATEDELETE 时在WHERE 子句中使用JOIN 而不是子查询,如

MySQL Error 1093 - Can't specify target table for update in FROM clause

【讨论】:

  • 如果您尝试在 UPDATEDELETE 查询中使用引用同一表的子查询,则会遇到相同的错误。为什么你认为这是INSERT 中的错误?
  • 。 . .这是values 的特性。如您的查询所示,您可以在 selectinsert 中拥有相同的表。
  • 当然,就像WHEREUPDATE/DELETE 查询中的特殊性一样,但是您可以使用JOIN 引用同一张表。
  • 你已经使用 MySQL 足够长的时间了,知道它充满了像这样愚蠢的限制,比如不能在查询中两次引用同一个临时表。
猜你喜欢
  • 2015-09-15
  • 2021-08-15
  • 2011-05-24
  • 2015-07-10
  • 2012-03-06
  • 1970-01-01
相关资源
最近更新 更多