2017-02-26 46 views
0

我想在數據庫中添加簡單的約束。 I follow this添加簡單的約束 - 數據庫

我的目標:在租戶表中,如果LeaseExpirationDate不爲NULL,那麼它必須晚於LeaseStartDate。

我想:

alter table Tenants 
    add constraint leasedates_check check (leaseexpirationdate is not null or leaseexpirationdate > leasestartdate); 

然後我嘗試:

UPDATE 
    Tenants 
SET 
    leaseexpirationdate = leasestartdate 
WHERE 
    apartmentnumber = 1 and houseid = 100; 

該行即使leaseexpirationdate is not null更新。我錯在哪裏?我沒有比較日期嗎?

創建聲明:

CREATE TABLE Tenants(
HouseID INT, 
ApartmentNumber INT, 
LeaseTenantSSN INT NOT NULL, 
LeaseStartDate DATE NOT NULL, 
LeaseExpirationDate DATE, 
Rent DECIMAL(7,2), 
LastRentPaidDate DATE, 
RentOverdue BOOLEAN, 
PRIMARY KEY(HouseID, ApartmentNumber)); 

我使用PostgreSQL。

回答

3

我的目標:在租戶表中,如果LeaseExpirationDate不爲NULL,那麼它必須遲於LeaseStartDate。

check(leaseexpirationdate is not null or leaseexpirationdate > leasestartdate)

這是說leaseexpirationdate不能爲空,或者如果它是空它必須比leasestartdate更大。比較null不是很有用。它將返回unknown這是SQL's ternary logic中的第三個布爾值。

相反,你要檢查leaseexpirationdate爲空或者如果它不爲空它必須比leasestartdate更大。

check(leaseexpirationdate is null or leaseexpirationdate > leasestartdate) 
4

這太長了評論。

這個約束:

alter table Tenants 
    add constraint leasedates_check check (leaseexpirationdate is not null or leaseexpirationdate > leasestartdate); 

等同於:

alter table Tenants 
    add constraint leasedates_check check (leaseexpirationdate is not null); 

想必,你似乎打算:

add constraint leasedates_check check (leaseexpirationdate is null or leaseexpirationdate > leasestartdate); 

注意檢查是is nullor是連接器。

0

PostgreSQL沒有使得表達這類規則理智的時間類型特殊infinity value。在這裏,如果我沒有弄錯,空值用於表示沒有到期日的租約。

我的目標是:在租戶表中,如果LeaseExpirationDate不爲NULL,那麼它必須晚於LeaseStartDate。

那麼,表的定義可以是:

CREATE TABLE "Tenants"(
    "HouseID" INT NOT NULL, 
    "ApartmentNumber" INT NOT NULL, 
    "LeaseTenantSSN" INT NOT NULL, 
    "LeaseStartDate" DATE NOT NULL, 
    "LeaseExpirationDate" DATE NOT NULL DEFAULT 'INFINITY', 
    "Rent" DECIMAL(7,2), 
    "LastRentPaidDate" DATE, 
    "RentOverdue" BOOLEAN, 

    PRIMARY KEY("HouseID", "ApartmentNumber") 
); 

而且,與檢查約束可以是:上述

ALTER TABLE "Tenants" 
    ADD CONSTRAINT leasedates_check check ("LeaseExpirationDate" > "LeaseStartDate"); 

@Gordon Linoff的答案是正確的歡迎,併爲大多數開發人員的默認方式是在數據庫中接近開始/結束時間&相關約束。

另請注意,Postgresql標識符不區分大小寫,除非引用,如在此答案中。