SQL 约束
先用设计器创建约束、再用代码创建约束。
数据库约束是为了保证数据的完整性(正确性)而实现的一套机制
见文件Employee.sql
非空约束(选择复选框)
主键约束(PK) primary key constraint 唯一且不为空(选中列,右键,设为主键)
唯一约束 (UQ)unique constraint 唯一,允许为空,但只能出现一次(右键,索引/键,添加)
默认约束 (DF)default constraint 默认值(选中列,设置列的默认帮定值)
检查约束 (CK)check constraint 范围以及格式限制(右键check约束,添加)
外键约束 (FK)foreign key constraint 表关系(在外键表,右键,关系,增加一个主外键关系)
增加外键约束时,设置级联更新、级联删除:
[ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
[ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
注意:创建约束时,如果表中已经存在“非法数据”(与约束不一致的数据),那么此时是无法成功创建约束的,需要先将表中的数据做更改,然后才能创建约束。
当创建了主外键关系后,如果在外键表中有任何记录引用了主键表中的某条记录,则在主键表中不能删除该记录。同时主键表也不能删除。
新建一张表:员工信息表
create table Employees
(
EmpId int identity(1,1),
EmpName varchar(50),
EmpGender char(2),
EmpAge int,
EmpEmail varchar(100),
EmpAddress varchar(500)
)
create table Department (
DepId int identity(1,1) ,
DepName varchar(50)
)
Drop table Employees
select * from Employees
--============手动增加约束==========
--手动删除一列(删除EmpAddress列) alter table Employees drop column EmpAddress
--手动增加一列(增加一列EmpAddr varchar(1000)) alter table Employees add EmpAddr11 varchar(500),AA int ,bb varchar(10)
--手动修改一下EmpEmail的数据类型(varchar(200)) alter table Employees alter column EmpAddr varchar(1000)
--为EmpId增加一个主键约束 alter table Employees add constraint PK_EmpId primary key(EmpId)
--非空约束,为EmpName增加一个非空约束 alter table Employees alter column EmpName varchar(50) not null
--为EmpName增加一个唯一约束 alter table Employees add constraint UQ_EmpName unique(EmpName)
--为性别增加一个默认约束,默认为'男' alter table Employees add constraint DF_EmpGender default('男') for EmpGender
--为年龄增加一个检查约束:年龄必须在-120岁之间,含岁与岁。 alter table Employees add constraint CK_EmpAge check(EmpAge >=0 and EmpAge<=120)
--创建一个部门表,然后为Employee表增加一个DepId列。 alter table Employees add DeptId int
--增加外键约束 alter table Employees add constraint FK_DeptId_DepId foreign key(DeptId) references Department(DepId)
--添加主键约束 alter table Score add constraint PK_Score primary key(sId)
--添加唯一约束 alter table student add constraint UQ_student unique(sNo)
--添加默认约束 alter table student add constraint DF_student default('男') for sSex
--添加检查约束 alter table student add constraint CK_student check(sAge >=18 and sAge <=100)
--添加外键约束(主键表Class 外键表student) alter table student add constraint FK_student foreign key(sClassId) references Class(cId)
--外键student表中的sClassId来references引用主键表中的cid
--级联删除 --on delete cascade on update cascade
--删除约束 alter table student drop constraint FK_student
--用一条语句为表增加多个约束。 alter table Employees add constraint PK_Employees_EmpId primary key(EmpId),
--增加主键约束 constraint UQ_Employees_EmpName unique(EmpName),
--增加唯一约束 constraint DF_Employees_EmpGender default('女') for EmpGender,
--默认约束 constraint CK_Employees_EmpAge check(EmpAge>=0 and EmpAge<=120), constraint FK_Employees_Department_DepId foreign key(DepId) references Department(DepId)
alter table Employees drop constraint CK_Employees_EmpAge, FK_Employees_DepId
==================================================================================================== 通过使用级联引用完整性约束,您可以定义当用户试图删除或更新现有外键指向的键时,SQL Server 2005 执行的操作。 CREATE TABLE 语句和 ALTER TABLE 语句的 REFERENCES 子句支持 ON DELETE 子句和 ON UPDATE 子句。还可以使用“外键关系”对话框定义级联操作:
[ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
--删除原有的外键约束 alter table Employees drop constraint FK_Employees_Department_DepId
--设置主外键关系的级联删除 alter table Employees add constraint FK_Employees_Department_DepId foreign key(DepId) references Department(DepId) on delete CASCADE
--设置级联删除 --on update cascade --设置级联更新
如果没有指定 ON DELETE 或 ON UPDATE,则默认为 NO ACTION。
ON DELETE NO ACTION 指定如果试图删除某一行,而该行的键被其他表的现有行中的外键所引用,则产生错误并回滚 DELETE 语句。
ON UPDATE NO ACTION 指定如果试图更新某一行中的键值,而该行的键被其他表的现有行中的外键所引用,则产生错误并回滚 UPDATE 语句。
CASCADE、SET NULL 和 SET DEFAULT 允许通过删除或更新键值来影响指定具有外键关系的表,这些外键关系可追溯到在其中进行修改的表。如果为目标表也定义了级联引用操作,那么指定的级联操作也将应用于删除或更新的那些行。不能为具有 timestamp 列的外键或主键指定 CASCADE。
ON DELETE CASCADE 指定如果试图删除某一行,而该行的键被其他表的现有行中的外键所引用,则也将删除所有包含那些外键的行。
ON UPDATE CASCADE 指定如果试图更新某一行中的键值,而该行的键值被其他表的现有行中的外键所引用,则组成外键的所有值也将更新到为该键指定的新值。
注意: 如果 timestamp 列是外键或被引用键的一部分,则不能指定 CASCADE。
ON DELETE SET NULL 指定如果试图删除某一行,而该行的键被其他表的现有行中的外键所引用,则组成被引用行中的外键的所有值将被设置为 NULL。为了执行此约束,目标表的所有外键列必须可为空值。
ON UPDATE SET NULL 指定如果试图更新某一行,而该行的键被其他表的现有行中的外键所引用,则组成被引用行中的外键的所有值将被设置为 NULL。为了执行此约束,目标表的所有外键列必须可为空值。
ON DELETE SET DEFAULT 指定如果试图删除某一行,而该行的键被其他表的现有行中的外键所引用,则组成被引用行中的外键的所有值将被设置为它们的默认值。为了执行此约束,目标表的所有外键列必须具有默认定义。如果某个列可为空值,并且未设置显式的默认值,则将使用 NULL 作为该列的隐式默认值。因 ON DELETE SET DEFAULT 而设置的任何非空值在主表中必须有对应的值,才能维护外键约束的有效性。
ON UPDATE SET DEFAULT 指定如果试图更新某一行,而该行的键被其他表的现有行中的外键所引用,则组成被引用行中的外键的所有值将被设置为它们的默认值。为了执行此约束,目标表的所有外键列必须具有默认定义。如果某个列可为空值,并且未设置显式的默认值,则将使用 NULL 作为该列的隐式默认值。因 ON UPDATE SET DEFAULT 而设置的任何非空值在主表中必须有对应的值,才能维护外键约束的有效性。
SQL 约束的更多相关文章
- SQL CREATE TABLE 语句\SQL 约束 (Constraints)\SQL NOT NULL 约束\SQL UNIQUE 约束
CREATE TABLE 语句 CREATE TABLE 语句用于创建数据库中的表. SQL CREATE TABLE 语法 CREATE TABLE 表名称 ( 列名称1 数据类型, 列名称2 数据 ...
- SQL约束
SQL约束: 非空约束:就是不能为null: 主键约束(PK):唯一,不重复,并且不为空: 唯一约束:唯一,允许为空,但只能出现一次: 默认约束:如果不给值,默认值: 检查约束:范围以及格式限制: 外 ...
- Mysql笔记【3】-SQL约束
SQL 约束 约束用于限制加入表的数据的类型. 可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句). 我们将主要探讨以下几种约 ...
- SQL 约束解说
SQL 约束解说 2009-04-27 09:29 约束主要包含: NOT NULL UNIQUE PRIMARY KEY FOREIGN KEY CHECK DEFAULT 1.not null : ...
- SQL 约束 (Constraints)
SQL 约束 约束用于限制加入表的数据的类型. 可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句). 我们将主要探讨以下几种约 ...
- SQL 约束(Constraints)
SQL 约束(Constraints) SQL 约束(Constraints) SQL 约束用于规定表中的数据规则. 如果存在违反约束的数据行为,行为会被约束终止. 约束可以在创建表时规定(通过 CR ...
- SQL-W3School-高级:SQL 约束(Contraints)
ylbtech-SQL-W3School-高级:SQL 约束(Contraints) 1.返回顶部 1. SQL 约束 约束用于限制加入表的数据的类型. 可以在创建表时规定约束(通过 CREATE T ...
- Bugku-CTF之login1(SKCTF) [SQL约束攻击]
Day26 login1(SKCTF) http://123.206.31.85:49163/flag格式:SKCTF{xxxxxxxxxxxxxxxxx}hint:SQL约束攻击 本题要点:SQL ...
- SQL——SQL约束
SQL约束 - 用于限制加入表的数据的类型 可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句). NOT NULL ...
- Bugku-login1(SKCTF)(SQL约束攻击)
原因 sql语句中insert和select对长度和空格的处理方式差异造成漏洞. select对参数后面的空格的处理方式是删除,insert只是取规定的最大长度的字符串. 逻辑 1.用 select ...
随机推荐
- Virtual Box配置CentOS7网络(图文教程)
之前很多次安装CentOS7虚拟机,每次配置网络在网上找教程,今天总结一下,全图文配置,方便以后查看. Virtual Box可选的网络接入方式包括: NAT 网络地址转换模式(NAT,Network ...
- 基于DDD的现代ASP.NET开发框架--ABP系列文章总目录
ABP相关岗位招聘:给热爱.NET新技术和ABP框架的朋友带来一个高薪的工作机会 ABP交流会录像视频:ABP架构设计交流群-7月18日上海线下交流会的内容分享(有高清录像视频的链接) 代码自动生成: ...
- MVVM TextBox的键盘事件
MVVM下RichTextBox的键盘回车事件设置为发送,不是回车 xmlns:i="http://schemas.microsoft.com/expression/2010/interac ...
- winform 窗体圆角设计
网上看到的很多winform窗体圆角设计代码都比较累赘,这里分享一个少量代码就可以实现的圆角.主要运用了System.Drawing.Drawing2D. 效果图 代码如下. private void ...
- 【转】组件化的Web王国
本文由 埃姆杰 翻译.未经许可,禁止转载!英文出处:Future Insights. 内容提要 使用许多独立组件构建应用程序的想法并不新鲜.Web Component的出现,是重新回顾基于组件的应用程 ...
- 萌新笔记——vim命令“=”、“d”、“y”的用法(结合光标移动命令,一些场合会非常方便)
vim有许多命令,网上搜有一堆贴子.文章列举出各种功能的命令. 对于"="."d"."y",我在无意中发现了它们所具有的相同的一些用法,先举 ...
- 一键生成APP官网
只需要输入苹果下载地址,安卓市场下载地址,或者内测下载地址,就能一键生成APP的官网,方便在网上推广. 好推APP官网 www.hotapp.cn/app
- fmt标签把时间戳格式化日期
jsp页面标签格式化日期 <%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="f" %> ...
- 如何让我们的PHP在Jexus中跑起来
最近一段时间,经常看到不少的朋友在问,应该怎么设置才能够让Jexus支持PHP.其实,Jexus在很早之前就已经是可以支持PHP,像Apache或Nginx一样充当PHP的Web服务器的.不过由于没有 ...
- Linux学习日记-使用EF6 Code First(四)
一.在linux上使用EF 开发环境 VS2013+mono 3.10.0 +EF 6.1.0 先检测一下EF是不是6的 如果不是 请参阅 Linux学习日记-EF6的安装升级(三) 由于我的数据库 ...