我正在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中声明的相同插入,将得到以下错误:
错误:关系“items”的新行违反了检查约束“items\u aviability\u check”
详细信息:失败的行包含(1,某些项目,1234567891234,15,20,20,40,2016-08-08,2016-09-22,空,空)。
关于database - PostgreSQL数据库中的条件索引,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38289177/