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)
);
我想要 运行 删除记录的查询,如果:
- 它们已被“认领”(
otu_is_claimed = 1
); 或
- 它们已过期 (
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()
我有以下 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)
);
我想要 运行 删除记录的查询,如果:
- 它们已被“认领”(
otu_is_claimed = 1
); 或 - 它们已过期 (
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()