我在 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"));
问题是索引不起作用,我可以将包含小于可用数量的所有数量值的行插入到表中。我刚刚尝试了这个查询,它成功返回。
INSERT INTO "Items" VALUES(1,'some_item','1234567891234',15,20,20,40,'2016-08-08','2016-09-22');
最佳答案
如果你想在你的表上应用一些业务逻辑,你需要使用约束,而不是索引:
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).
关于database - PostgreSQL 数据库中的条件索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38289177/