如果我想将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
也是一种约束。.
答案 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)
将其视为NULL
或NOT 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 )
在这里,我们看到NULL
和NOT NULL
实际上是类型声明的一部分。
还请考虑这些字段在数据库中需要不同数量的空间。
答案 3 :(得分:0)
在我看来,“非空”也是一种约束。.
是的。数据类型,NULL-ness,CHECK CONSTRAINTS和FOREIGN KEY约束都与定义列的“域”有关。 “域”是列的可能值的集合,并且是关系模型的基本概念。
在大多数RDBMS系统中,域是通过数据类型和约束的组合来实现的。