mingche 发表于 2018-10-23 08:31:44

31. SQL -- 完整性及约束(2)

  唯一性约束:
  所谓唯一性约束(unique constraint)不过是数据表内替代键的另一个名称而已。替代键(alternate key)可以是数据表内不作为主键的其他任何列,只要该键对该数据表唯一即可。换句话说,在唯一列内不允许出现数据重复的现象唯一性约束指定一个或多个列的组合的值具有唯一性,以防止在列中输入重复的值。唯一性约束指定的列可以有NULL 属性。
  语法:
  CONSTRAINT constraint_name
  UNIQUE
  (column_name1[, column_name2,…,column_name16])
  DEMO1:
  创建国家(Country)表,指定国家不能重复,ID号为主键。
  CREATE TABLE Country
  (
  cCountryId CHAR(3) PRIMARY KEY, /*省略部分关键字,行级约束,没有指定约束名*/
  cCountry CHAR(25) NOT NULL UNIQUE ) /*行级约束,没有指定约束名*/
  插入3条数据:
  insert into Country
  values
  ('A01','china'),
  ('A02','yemen'?xml:namespace>),
  ('A03','IR')
  查看结果:
  select * from Country
  新插入一条数据,在列cCountry中指一条记录与之前插入记录值相同的数值:
  insert into Country
  values ('A04','china')
  出下如下错误:
  消息2627,级别14,状态1,第2 行
  违反了UNIQUE KEY 约束'UQ__Country__62A4127E20C1E124'。不能在对象'dbo.Country' 中插入重复键。
  语句已终止。
  DEMO2:若表已创建,通过ALTER TABLE来进行创建UNIQUE约束
  alter table country
  add constraint UQ_Country_cCountry unique (cCountry)
  /*表级约束*/
  图形化界面创建:
  数据库 → 表 → 设计 → 选择创建约束的列 → 右键 → 索引/键
  创建约束
  
  CHECK约束:
  CHECK 约束(CHECK 约束:定义列中可接受的数据值,检查约束通过限制插入列中的值来实施域完整性。可以在一列上定义多个检查约束。它们按照定义的次序被实施。当约束被定义成表级时,单一的检查约束可以被应用到多列,也可以将多个 CHECK 约束应用于单个列。当除去某个表时,也将除去 CHECK 约束。
  CHECK约束的限制:
  ○1 、CHECK 约束不接受计算结果为FALSE 的值。因为空值的计算结果为UNKNOWN,所以表达式中存在这些值可能会覆盖约束,例如,假设对int 列 MyColumn 应用一个约束,指定 MyColumn 只能包含值10(即 MyColumn = 10)。如果将值NULL 插入到 MyColumn,数据库引擎将插入 NULL 且不返回错误。
  ○2 、如果 CHECK 约束检查的条件对于表中的任何行都不是 FALSE,它将返回 TRUE。如果刚创建的表没有任何行,则此表的任何 CHECK 约束都视为有效
  ○3 、执行 DELETE 语句时不验证CHECK 约束。因此,使用特定类型的 CHECK 约束对表执行 DELETE 语句时可能会产生意外结果
  DEMO:假设对表 CheckTbl 执行下列语句。
  INSERT INTO CheckTbl VALUES (10, 10)
  GO
  DELETE CheckTbl WHERE col1 = 10;
  即使 CHECK 约束指定表 CheckTbl 必须至少包含 1 行,DELETE 语句也会成功
  语法:
  CONSTRAINT constraint_name
  CHECK
  (logical_expression)
  CHECK约束可以连同下列关键字或命令一起指定:
  IN关键字
  使用IN 关键字可以确保:键入的值被限制在一个常数表达式列表中。
  例如:下列命令在表Shopper的列cCity上创建了CHECK约束chkCity,这样就能将输入限制在合法的城市中。
  CREATE TABLE Shopper
  (
  cCity CHAR(15) NOT NULL CONSTRAINT chkCity CHECK(cCity IN ('Boston', 'Chicago','
  Dallas','New York', 'Paris','Washington'))
  )
  LIKE关键字
  使用LIKE关键字可以通过通配符来确保输入某一列的值符合一定的模式。
  例如:
  CHECK (cShopperId LIKE ‘ ‘)
  上述CHECK约束指定——,之间只能包含六位数值。
  BETWEEN 关键字
  可以通过BETWEEN关键字来指明常数表达式的范围。该范围中包括上限值和下限值。
  例如:
  CHECK (siToyQoh BETWEEN 0 AND 100)
  上述CHECK约束指定了属性siToyQoh的值只能在0和100之间。
  创建Check约束时应遵循的规则:
  它可以在列级或表级创建。
  它用来限制可以插入到该列的值。
  它可以包含用户自定义的搜索条件。
  它不能包含子查询。
  如果创建时指定了WITH NOCHECK选项,就不检查已有数据。
  它可以引用同一表中的其他列
  DEMO:限制表tb2中列silowerage输入值需>=2,列siupperage输入值需=2)
  alter table tb2
  add constraint CK_tb2_siupperage
  check (siupperage
页: [1]
查看完整版本: 31. SQL -- 完整性及约束(2)