1

Я работаю с PostgreSQL Database версии 9.5 на Windows 10 Pro x64.Условный индекс в базе данных PostgreSQL

В моей базе данных У меня есть два целых столбца по одному для всех Количество и единица для доступного количества. То, что я в принципе хочу, чтобы предотвратить вставку или обновление, если все количество меньше, чем доступное количество, так что я создал этот индекс:

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'); 

ответ

1

Если вы хотите применить некоторые бизнес-логику на вашем столе вы должны использовать ограничение, а не индекс:

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).

+1

Спасибо, это сработало как шарм – Waxren

Смежные вопросы