为什么“ NOT NULL”不是约束?

时间:2019-04-14 16:21:26

标签: sql sql-server

如果我想将PRIMARY KEY添加到现有的列表中:

ALTER TABLE table_name
ADD CONSTRAINT column_name_PK PRIMARY KEY (column_name);

现在,如果我想向现有的列表添加NOT NULL:

ALTER TABLE table_name
ALTER column column_name INTEGER(or other data type) NOT NULL;

不是NOT NULL约束吗? 为什么主键是ADD CONSTRAINT

,对于NOT NULL不是ADD CONSTRAINT而是ALTER COLUMN吗? 在我看来,NOT NULL也是一种约束。.

4 个答案:

答案 0 :(得分:3)

指定NOT NULL表示“该列必须具有值”。它仅表示必须必须存在某些值,但是对于这些值应为却一无所获。请注意,在SQL术语中,NULL本身不是值,而是缺少值

另一方面,CONSTRAINT是允许值的规则。您甚至可以对NULL列进行约束,然后仅当存在非NULL值时才对允许的值强制执行此类CONSTRAINT

答案 1 :(得分:0)

在声明参数时,可以只使用day.getValue() - myDate.getDayOfWeek().getValue(); 内联。像这样:

public static void main(String[] args) {

    DateTimeFormatter ldt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    DateTimeFormatter lt = DateTimeFormatter.ofPattern("HH:mm:ss");

    LocalDateTime myDate = LocalDateTime.parse("2019-04-14 16:00:00", ldt);
    DayOfWeek day = DayOfWeek.MONDAY;
    LocalTime time = LocalTime.parse("01:00:00", lt);

    LocalDateTime next = getNext(myDate,day,time);
    System.out.println(next.format(ldt));
}
public static LocalDateTime getNext(LocalDateTime ldt, DayOfWeek dow, LocalTime lt){  
    int daysToAdd = dow.getValue() - ldt.getDayOfWeek().getValue();
    daysToAdd = daysToAdd < 0 ? daysToAdd +7 : daysToAdd;
    if(daysToAdd == 0 ){
        daysToAdd = LocalTime.of(ldt.getHour(), ldt.getMinute(), ldt.getSecond()).isAfter(lt) ? 7:0;
    }
    return LocalDateTime.of(ldt.getYear(), ldt.getMonthValue(), ldt.getDayOfMonth(), 
                            lt.getHour(), lt.getMinute(), lt.getSecond())
                           .plusDays(daysToAdd);
}

答案 2 :(得分:0)

将其视为NULLNOT NULL实际上是类型声明的一部分。可以容纳Integer并且还可以容纳NULL的字段与可以容纳Integer但不能容纳NULL的字段的类型不同。

考虑

create type IntegerIsSometimesNull from integer null

create type IntegerIsNeverNull  from integer not null

go

create table DifferentType ( N IntegerIsSometimesNull,
                             I IntegerIsNeverNull      )

在这里,我们看到NULLNOT NULL实际上是类型声明的一部分。

还请考虑这些字段在数据库中需要不同数量的空间。

答案 3 :(得分:0)

  

在我看来,“非空”也是一种约束。.

是的。数据类型,NULL-ness,CHECK CONSTRAINTS和FOREIGN KEY约束都与定义列的“域”有关。 “域”是列的可能值的集合,并且是关系模型的基本概念。

在大多数RDBMS系统中,域是通过数据类型和约束的组合来实现的。