【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 between20and40)
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 个列组成。
#例⼦:
1CREATE TABLE[dbo].[UserInfo](
2[UserId][int]NOT NULL,
3[UserName][nvarchar](50) NOT NULL,
4CONSTRAINT[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
指定列的外关键字约束在把从其它表中复制的数据插⼊到表中时不发⽣作⽤。
#例⼦:
1CREATE TABLE[dbo].[UserOrder](
2[OrderId][int]NOT NULL,
创建唯一约束sql语句3[UserId][int]NOT NULL,
4[UserName][nvarchar](50) NOT NULL,
5CONSTRAINT 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例⼦:
1create table employees (
2 emp_id char(8),
3 emp_name char(10) ,
4 emp_cardid char(18),
5constraint pk_emp_id primary key (emp_id),
6constraint 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。
#例⼦:
1create table orders(
2 order_id char(8),
3 p_id char(8),
4 p_name char(10) ,
5 quantity smallint,
6constraint pk_order_id primary key (order_id),
7constraint chk_quantity check (quantity>=10) ,
8 ) on[primary]
注意:对计算列不能作除检查约束外的任何约束。
5、缺省约束
缺省约束通过定义列的缺省值或使⽤数据库的缺省值对象绑定表的列,来指定列的缺省值。SQL Server 推荐使⽤缺省约束,⽽不使⽤定义缺省值的⽅式来指定列的缺省值。
#定义缺省约束的语法如下:
CONSTRAINT constraint_name
DEFAULT constant_expression [FOR column_name]
#例⼦:
1CREATE TABLE[dbo].[Students](
2[Id][int]NOT NULL,
3[Name][nchar](10) NULL,
4[Age][int]
5 ) ON[PRIMARY]
6
7GO
8ALTER TABLE[dbo].[Students]ADD DEFAULT ('未知') FOR[Name]
9GO
1alter table[dbo].[Students]add Sex char(2) default'男'
2
3alter table[dbo].[Students]add constraint DF_age_Students default(20) for age
6、列约束和表约束
对于数据库来说,约束⼜分为列约束(Column Constraint)和表约束(Table Constraint)。
列约束作为列定义的⼀部分只作⽤于此列本⾝。表约束作为表定义的⼀部分,可以作⽤于
多个列。
由上图可知,1,主键、外键、唯⼀、检查这四项,既可以创建列约束,也可以创建表约束。⽽缺省和⾮空只能创建列约束。
例⼦:
1create table productsss (
2 p_id char(8) ,
3 p_name char(10) ,
4 price money default0.01 ,
5 quantity smallint check (quantity>=10) , /* 列约束 */
6constraint 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],则默认会创建⾮聚焦索引。
参考:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论