Я хочу добавить цены акций в таблицу - но только если покупка или продажа изменились по сравнению с последней записью.
Поэтому UNIQUE на самом деле не работает, так как не позволяет использовать одну и ту же ценовую комбинацию в таблице более одного раза.
Я могу придумать пути решения проблемы за пределами postgres (до фактической вставки строк), но мне было интересно, есть ли способ настроить таблицу цен , чтобы справиться с этим для меня.
CREATE TABLE stock(
id SMALLSERIAL PRIMARY KEY,
name VARCHAR(3) UNIQUE NOT NULL
);
CREATE TABLE prices(
id SMALLSERIAL PRIMARY KEY,
created_at TIMESTAMPTZ DEFAULT current_timestamp,
stock_id INTEGER NOT NULL,
buy NUMERIC(15, 6) NOT NULL,
sell NUMERIC(15, 6) NOT NULL,
FOREIGN KEY (stock_id) REFERENCES stock(id),
UNIQUE(stock_id, buy, sell)
);
INSERT INTO stock(name) VALUES('abc');
INSERT INTO prices (stock_id, buy, sell) VALUES (1, 1.5, 1.4)
ON CONFLICT (stock_id, buy, sell) DO NOTHING;
INSERT INTO prices (stock_id, buy, sell) VALUES (1, 1.5, 1.4)
ON CONFLICT (stock_id, buy, sell) DO NOTHING; -- this record should not be added to the table
INSERT INTO prices (stock_id, buy, sell) VALUES (1, 1.6, 1.5)
ON CONFLICT (stock_id, buy, sell) DO NOTHING;
INSERT INTO prices (stock_id, buy, sell) VALUES (1, 1.5, 1.4)
ON CONFLICT (stock_id, buy, sell) DO NOTHING; -- this one should be added to the table
sqlfiddle
Так что в моем примере я хотел бы иметь 3 строки в таблице вместо 2 - должна блокироваться только 2-я вставка в цены, а не 4-я.