2017-02-26 47 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标识符不区分大小写,除非引用,如在此答案中。