database - PostgreSQL 数据库中的条件索引

标签 database postgresql relational-database database-indexes

我在 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/

相关文章:

python - 奇怪的时区行为 Django

sql - 如何在 postgresql 中存储和搜索连字符/非连字符的 url 名称?

oop - 好的关系型数据库设计可以将好的面向对象的设计形式化吗?

javascript - 如何将 Neo4j 查询转换为 GraphQL 查询?

mysql - 使用 MySQL 进行双向复制以在多个离线客户端之间同步数据库应用程序的实例?

php - 虽然php中的嵌套循环从sql数据库中获取数据

sql - pg_restore 清理表 psql

sql - 如何在单个 POSTGRESQL 查询中获取列名及其引用类型(即 PRIMARY KEY 和 FOREIGN KEY)?

mysql - 在 hdfs 中进行选择的最佳方法?

c# - 数据量大时DataContext性能不好