有一个带有索引的表需要修改,以便它也type以这样的方式限制字段,它只能type取三个值LONG,,,。SHORTUNIVERSAL
根据规则:任何一个字符串都必须UNIVERSAL通过组合没有重复symbol_id, account_id, enabled。或允许一LONG、一SHORT为组合symbol_id, account_id, enabled。
或者换句话说symbol_id, account_id, enabled,它enabled == TRUE可以是一个独特的组合:
一个通用实例(
UNIVERSAL这意味着它既可以工作又可以如何工作LONG)SHORT。两个实例,一个
LONG和一个SHORT。每个实例至少有一个
LONG,或者SHORT应该有true
LONG, 并且SHORT可以单独存在, 即例如LONG有, 但SHORT没有, 没有计划. 或相反亦然。
-- Instances
CREATE TABLE IF NOT EXISTS instances
(
id BIGSERIAL PRIMARY KEY,
enabled BOOLEAN NOT NULL,
title VARCHAR(255) NOT NULL,
type VARCHAR(255) NOT NULL,
status VARCHAR(255) NOT NULL,
updated_at TIMESTAMP NOT NULL,
last_callback TIMESTAMP,
settings VARCHAR(255),
user_id BIGINT REFERENCES users (id),
symbol_id BIGINT REFERENCES symbols (id),
account_id BIGINT REFERENCES accounts (id),
strategy_id BIGINT REFERENCES strategies (id)
);
和索引:
CREATE UNIQUE INDEX ui_symbol_account_enabled
ON instances (symbol_id, account_id, enabled)
WHERE (enabled IS TRUE);
它可能应该是这样的:
CREATE UNIQUE INDEX ui_symbol_account_enabled_type
ON instances (symbol_id, account_id, enabled, type)
WHERE (enabled IS TRUE
AND (type = 'UNIVERSAL' OR type = 'SHORT' OR type = 'LONG')
);
仅不是三个值之一,而是根据上述规则。如何正确书写?
如果架构更改是可以接受的,那么我建议这个(简化的)选项:
因此,您的类型
'UNIVERSAL'变成满足条件的记录long AND short。如果无法更改方案,则: