我是否需要在具有CHECK约束的列上指定NOT NULL?

时间:2019-04-23 00:45:04

标签: sql sql-server

doctorName VARCHAR(50) CHECK(LEN(doctorName ) > 0)

我应该在前面的声明中指定NOT NULL吗? 不允许使用NULL值,因为它不会通过CHECK约束...那么在这种情况下指定NOT NULL的目的是什么?

1 个答案:

答案 0 :(得分:4)

您必须指定def winners(): f2 = open("world_cup_champions.txt","r+") total_wins = {} years = {} lines = [] country_list = [] for line in f2: lines.append(line.strip()) # Skip the first line with [1:] for line in lines[1:]: values = line.split(',') country = values[1] year = values[0] if country not in total_wins: total_wins[country] = 1 years[country] = [year] country_list.append(country) else: total_wins[country] += 1 years[country].append(year) for country in country_list: wins = total_wins[country] year_list = years[country] print(" " + country.ljust(14)), print(" " + str(wins)), print(year_list) def main(): print("FIFA World Cup Winners") print() print(" Country".ljust(14) + " Wins".center(9) + "Years".rjust(14)) print("{:15} {:5}".format("="*8, "="*5)) winners() if __name__ == "__main__": main()

NOT NULL

或检查约束:

doctorName VARCHAR(50) NOT NULL CHECK(LEN(doctorName ))

第一个比较可取,因为doctorName VARCHAR(50) CHECK(LEN(doctorName ) > 0 AND doctorName IS NOT NULL) 是内置在SQL中的,因此优化程序可以利用它。

为什么这是必需的?如果名称为NOT NULL,则比较返回NULLNULL约束的工作方式不同于CHECK子句和WHERE表达式。仅当表达式的计算结果为FALSE时,CASE约束才会失败。因此,TRUE和CHECK都满足约束条件。另一方面,NULL子句和WHERE表达式将CASE视为FALSE,而不是TRUE。

Here是一个db <>小提琴示例,显示NULL约束未捕获NULL值。