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

MySQL query fails while performing conditional delete

我有以下 MySQL table:

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

我该怎么做才能修复此查询,使其按我需要的方式运行?

我没有看到子查询的意义,即 returns 主键列的值到外部查询。这似乎可以满足您的要求:

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