PostgreSQL 数据库中的条件索引

Conditional Index in PostgreSQL Database

我在 Windows 10 Pro x64 上使用 PostgreSQL 数据库版本 9.5。

在我的数据库中,我有两个整数列,一个用于所有数量,一个用于可用数量。 我基本上想要的是在所有数量小于可用数量时防止插入或更新,所以我创建了这个索引:

CREATE TABLE IF NOT EXISTS "Items"("Id" SERIAL PRIMARY KEY, "Name" VARCHAR(255) NOT NULL UNIQUE,
"Barcode" VARCHAR(255) NOT NULL UNIQUE, "AllQuantity" INTEGER NOT NULL, "AvailableQuantity" INTEGER NOT NULL,
"PurchasingPrice" NUMERIC NOT NULL, "SellingPrice" NUMERIC NOT NULL, "ProductionDate" DATE DEFAULT NULL, "ExpirationDate" DATE DEFAULT NULL,
"Description" TEXT DEFAULT NULL, "OtherDetails" TEXT DEFAULT NULL);

CREATE INDEX items_quantity ON "Items" (("AllQuantity" > "AvailableQuantity"));

问题是索引不起作用,我可以将包含小于可用数量的所有数量值的行插入 table。我刚刚尝试了这个查询,它成功返回。

INSERT INTO "Items" VALUES(1,'some_item','1234567891234',15,20,20,40,'2016-08-08','2016-09-22');

如果您想在 table 上应用一些业务逻辑,您需要使用约束,而不是索引:

ALTER TABLE "Items" 
ADD CONSTRAINT "Items_Avialability_Check" 
CHECK ("AllQuantity" > "AvailableQuantity");

有了这个约束,如果您尝试执行与 OP 中所述相同的插入操作,您将收到以下错误:

ERROR: new row for relation "Items" violates check constraint "Items_Avialability_Check" DETAIL: Failing row contains (1, some_item, 1234567891234, 15, 20, 20, 40, 2016-08-08, 2016-09-22, null, null).