【SQL】数据库中的五种约束

#五大约束

  1、主键约束(Primay Key Coustraint) 唯一性,非空性
  2、唯一约束 (Unique Counstraint)唯一性,可以空,但只能有一个
  3、检查约束 (Check Counstraint)对该列数据的范围、格式的限制(如:年龄、性别等)
  4、默认约束 (Default Counstraint)该数据的默认值
  5、外键约束 (Foreign Key Counstraint)需要建立两表间的关系并引用主表的列

 

#五大约束的语法示例

1、添加主键约束(将UserId作为主键)

  alter table UserId
  add constraint PK_UserId primary key (UserId)

2、添加唯一约束(身份证号唯一,因为每个人的都不一样)

  alter table UserInfo
  add constraint UQ_IDNumber unique(IdentityCardNumber)

 3、添加默认约束(如果地址不填 默认为“地址不详”)

  alter table UserInfo
  add constraint DF_UserAddress default (‘地址不详’) for UserAddress

4、添加检查约束 (对年龄加以限定 20-40岁之间)

  alter table UserInfo
  add constraint CK_UserAge check (UserAge between 20 and 40)
  alter table UserInfo
  add constraint CK_UserSex check (UserSex=’男’ or UserSex=’女′)

5、添加外键约束 (主表UserInfo和从表UserOrder建立关系,关联字段UserId)

  alter table UserOrder
  add constraint FK_UserId_UserId foreign key(UserId)references UserInfo(UserId)

#SQL Server中五大约束详解

   约束(Constraint)是Microsoft SQL Server 提供的自动保持数据库完整性的一种方法,定义了可输入表或表的单个列中的数据的限制条件。在SQL Server 中有5 种约束:主关键字约束(Primary Key Constraint)、外关键字约束(Foreign Key Constraint)、惟一性约束(Unique Constraint)、检查约束(Check Constraint)和缺省约束(Default Constraint)。

1、主关键字约束

  主关键字约束指定表的一列或几列的组合的值在表中具有惟一性,即能惟一地指定一行记录。每个表中只能有一列被指定为主关键字,且IMAGE 和TEXT 类型的列不能被指定为主关键字,也不允许指定主关键字列有NULL 属性。

此处应有说明:多列组成的主键叫联合主键,而且联合主键约束只能设定为表级约束;单列组成的主键,既可设定为列级约束,也可以设定为表级约束。

  表级约束与列级约束:点我!

  联合主键

  联合主键就是用2个或2个以上的字段组成主键。用这个主键包含的字段作为主键,这个组合在数据表中是唯一,且加了主键索引。
  可以这么理解,比如,你的订单表里有很多字段,一般情况只要有个订单号bill_no做主键就可以了,但是,现在要求可能会有补充订单,使用相同的订单号,那么这时单独使用订单号就不可以了,因为会有重复。那么你可以再使用个订单序列号bill_seq来作为区别。把bill_no和bill_seq设成联合主键。即使bill_no相同,bill_seq不同也是可以的。

  #定义主关键字约束的语法如下:

CONSTRAINT constraint_name
PRIMARY KEY [CLUSTERED | NONCLUSTERED]
(column_name1[, column_name2,…,column_name16])

  #各参数说明如下:
    constraint_name
    指定约束的名称约束的名称。在数据库中应是惟一的。如果不指定,则系统会自动生成一个约束名。
    CLUSTERED | NONCLUSTERED
    指定索引类别,CLUSTERED 为缺省值。
    column_name
    指定组成主关键字的列名。主关键字最多由16 个列组成。

  #例子:

1 CREATE TABLE [dbo].[UserInfo](
2     [UserId] [int] NOT NULL,
3     [UserName] [nvarchar](50) NOT NULL,
4     CONSTRAINT [PK_UserInfo] PRIMARY KEY CLUSTERED 
5     (
6         [UserId] ASC,
7         [UserName] ASC
8     )
9 ) ON [PRIMARY]

2、外关键字约束

   外关键字约束定义了表之间的关系。当一个表中的一个列或多个列的组合和其它表中的主关键字定义相同时,就可以将这些列或列的组合定义为外关键字,并设定它适合哪个表中哪些列相关联。这样,当在定义主关键字约束的表中更新列值,时其它表中有与之相关联的外关键字约束的表中的外关键字列也将被相应地做相同的更新。外关键字约束的作用还体现在,当向含有外关键字的表插入数据时,如果与之相关联的表的列中无与插入的外关键字列值相同的值时,系统会拒绝插入数据。与主关键字相同,不能使用一个定义为 TEXT 或IMAGE 数据类型的列创建外关键字。外关键字最多由16 个列组成。

   #定义外关键字约束的语法如下:

CONSTRAINT constraint_name
FOREIGN KEY (column_name1[, column_name2,…,column_name16]REFERENCES ref_table [ (ref_column1[,ref_column2,…, ref_column16] )]
[ ON DELETE { CASCADE | NO ACTION } ]
[ ON UPDATE { CASCADE | NO ACTION } ] ]
[ NOT FOR REPLICATION ]

   #各参数说明如下:

    REFERENCES
    指定要建立关联的表的信息。
    ref_table
    指定要建立关联的表的名称。
    ref_column
    指定要建立关联的表中的相关列的名称。

    ON DELETE {CASCADE | NO ACTION}
      指定在删除表中数据时,对关联表所做的相关操作。在子表中有数据行与父表中的对应数据行相关联的情况下,如果指定了值CASCADE,则在删除父表数据行时会将子表中对应的数据行删除;如果指定的是NO ACTION,则SQL Server 会产生一个错误,并将父表中的删除操作回滚。NO ACTION 是缺省值。

    ON UPDATE {CASCADE | NO ACTION}
      指定在更新表中数据时,对关联表所做的相关操作。在子表中有数据行与父表中的对应数据行相关联的情况下,如果指定了值CASCADE,则在更新父表数据行时会将子表中对应的数据行更新;如果指定的是NO ACTION,则SQL Server 会产生一个错误,并将父表中的更新操作回滚。NO ACTION 是缺省值。

    NOT FOR REPLICATION
      指定列的外关键字约束在把从其它表中复制的数据插入到表中时不发生作用。

   #例子:

1 CREATE TABLE [dbo].[UserOrder](
2     [OrderId] [int] NOT NULL,
3     [UserId] [int] NOT NULL,
4     [UserName] [nvarchar](50) NOT NULL,
5     CONSTRAINT fk_userid_username FOREIGN KEY([UserId],[UserName]) REFERENCES UserInfo(UserId,UserName) ON DELETE CASCADE,
6 ) ON [PRIMARY]

 3、惟一性约束

  惟一性约束指定一个或多个列的组合的值具有惟一性,以防止在列中输入重复的值。惟一性约束指定的列可以有NULL 属性。由于主关键字值是具有惟一性的,因此主关键字列不能再设定惟一性约束。惟一性约束最多由16 个列组成

  #定义惟一性约束的语法如下:

CONSTRAINT constraint_name
UNIQUE [CLUSTERED | NONCLUSTERED]
(column_name1[, column_name2,…,column_name16])

   #l例子:

1 create table employees (
2     emp_id char(8),
3     emp_name char(10) ,
4     emp_cardid char(18),
5     constraint pk_emp_id primary key (emp_id),
6     constraint uk_emp_cardid unique (emp_cardid)
7 ) on [primary]

 4、检查约束

  检查约束对输入列或整个表中的值设置检查条件,以限制输入值,保证数据库的数据完整性。可以对每个列设置复合检查。

  #定义检查约束的语法如下:

CONSTRAINT constraint_name
CHECK [NOT FOR REPLICATION]
(logical_expression)

  #各参数说明如下:
    NOT FOR REPLICATION
      指定检查约束在把从其它表中复制的数据插入到表中时不发生作用。
    logical_expression
      指定逻辑条件表达式返回值为TRUE 或FALSE。

  #例子:

1 create table orders(
2     order_id char(8),
3     p_id char(8),
4     p_name char(10) ,
5     quantity smallint,
6     constraint pk_order_id primary key (order_id),
7     constraint chk_quantity check (quantity>=10) ,
8 ) on [primary]

   注意:对计算列不能作除检查约束外的任何约束。

 5、缺省约束

  缺省约束通过定义列的缺省值或使用数据库的缺省值对象绑定表的列,来指定列的缺省值。SQL Server 推荐使用缺省约束,而不使用定义缺省值的方式来指定列的缺省值。

   #定义缺省约束的语法如下:

CONSTRAINT constraint_name
DEFAULT constant_expression [FOR column_name]

  #例子:

1 CREATE TABLE [dbo].[Students](
2     [Id] [int] NOT NULL,
3     [Name] [nchar](10) NULL,
4     [Age] [int]
5 ) ON [PRIMARY]
6 
7 GO
8 ALTER TABLE [dbo].[Students] ADD  DEFAULT ('未知') FOR [Name]
9 GO
1 alter table [dbo].[Students] add Sex char(2) default ''
2 
3 alter table [dbo].[Students] add constraint DF_age_Students default(20) for age 

6、列约束和表约束

   对于数据库来说,约束又分为列约束(Column Constraint)和表约束(Table Constraint)。
列约束作为列定义的一部分只作用于此列本身。表约束作为表定义的一部分,可以作用于
多个列。

 

   由上图可知,1,主键、外键、唯一、检查这四项,既可以创建列约束,也可以创建表约束。而缺省 和 非空只能创建列约束

   例子:

1 create table productsss (
2     p_id char(8) ,
3     p_name char(10) ,
4     price money default 0.01 ,
5     quantity smallint check (quantity>=10) , /* 列约束 */
6     constraint pk_p_id_name primary key (p_id, p_name) /* 表约束 */
7 )

 7、关于约束的其他操作

  #删除约束

ALTER TABLE employees DROP CONSTRAINT emp_manager_fk;

  #关闭约束

ALTER TABLE employees DISABLE CONSTRAINT emp_emp_id_pk CASCADE;   //如果没有被引用则不需CASCADE关键字

 

  #打开约束

ALTER TABLE employees 
ENABLE CONSTRAINT emp_emp_id_pk; //注意,打开一个先前关闭的被引用的主键约束,并不能自动打开相关的外部键约束

 

注:

  1. 添加主键约束会自动创建唯一索引。如果表中尚未创建 聚焦索引,则自动创建聚焦唯一索引。如果表中已存在聚焦索引,则自动创建非聚焦索引。

  2. 添加唯一约束会自动创建唯一索引。如果未在unique关键字后加上[nonclustered|clustered],则默认会创建非聚焦索引。

 

参考:

  https://blog.csdn.net/shuohuameijiang/article/details/7275716

  https://www.cnblogs.com/cyxdn/p/8509082.html

 

posted @ 2018-06-25 20:20  willingtolove  阅读(43492)  评论(1编辑  收藏  举报