是否可以有一个包含四列的表:
CREATE TABLE accrual (
add_date date NOT NULL,
user_id integer NOT NULL,
rate integer NOT NULL,
amount numeric(7,3)
);
然后对其进行约束,以便如果我已经有一个条目,例如
('2016-04-01', 3, 120, 25.6)
尝试插入另一个具有相同日期和 user_id 但速率不同的条目会失败吗?IE
('2016-04-01', 3, 140, 15)
会失败,但是
('2016-04-02', 3, 140, 15)
或者
('2016-04-01', 4, 140, 15)
或者
('2016-04-01', 3, 120, 15)
会好吗?
需要明确的是,日期和 user_id 基本上就像一个索引,除了重复索引完全可以,只要费率相同。金额不受限制。
我正在使用 postrgesql 9.5 数据库,并且正在使用 PHP。我的猜测是,最简单的做法是编写一些 PHP 代码来执行检查。我能找到的最接近的问题是这个:
但它是关于 Oracle 数据库的,并且略有不同。
感谢您的任何建议!!!
正如@NeilMcGuigan 建议的那样,排除约束是这里的关键。我不熟悉的部分是使用 <> 运算符的能力。Postgres 9.0 后可用:
两个有用的链接是:
和