执行条件删除时,MySQL查询失败

问题描述

我有以下MysqL表:

CREATE TABLE IF NOT EXISTS otu_tokens (
  otu_token_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,otu_token_ref_id VARCHAR(36) NOT NULL,otu_is_claimed INTEGER,otu_expires_on DATETIME,CONSTRAINT pk_otu_tokens PRIMARY KEY (otu_token_id),INDEX idx_otu_tokens_ref_id (otu_token_ref_id),CONSTRAINT uc_otu_tokens_ref_id UNIQUE (otu_token_ref_id)
);

我想运行一个删除记录的查询,如果存在以下情况:

  1. 他们已被“声明”(otu_is_claimed = 1); OR
  2. 他们已经过期(otu_expires_on < Now IN UTC

UTC部分很重要;这些记录将以其otu_expires_on的值设置为UTC进行存储,因此我需要确保“ Now IN UTC”比较实际上使用的是UTC。

我最好的尝试:

DELETE FROM otu_tokens
WHERE otu_token_id IN (
  SELECT otu.otu_token_id
  FROM otu_tokens otu
  WHERE
    otu.otu_is_claimed = 1
    OR
    otu.otu_expires_on < UTC_TIMESTAMP()
);

产生以下错误

ERROR 1093 (HY000): You can't specify target table 'otu_tokens' for update in FROM clause

该如何解决查询,使其表现出所需的状态?

解决方法

我看不到子查询的要点,该要点将主键列的值返回到外部查询。这似乎可以满足您的要求:

DELETE FROM otu_tokens
WHERE otu_is_claimed = 1 OR otu_expires_on < UTC_TIMESTAMP()