Database PostgreSQL数据库中的条件索引

Database PostgreSQL数据库中的条件索引,database,postgresql,relational-database,database-indexes,Database,Postgresql,Relational Database,Database Indexes,我正在使用Windows10Pro 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 U

我正在使用Windows10Pro 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,402016-08-082016-09-22,null,null)