SQL Sever 数据库之约束

数据库的约束


一、创建、修改和删除约束

  • 约束是SQL Server提供的自动强制数据完整性的一种方式,通过定义列的取值规则,是强制完整性的标准机制。使用约束优先于触发器、规则和默认值。

1、非空约束

  • 列的为空性决定表中的行是否可为该列包含空值。空值(NULL)不同于0、空白或长度为零的字符串,NULL的意思是没有输入,出现NULL值通常是值未知或未定义。

1.1、创建非空约束

  • 可在用CREATE TABLE创建表时,使用NOT NULL关键字指定非空约束,语法如下:

    [CONSTRAIN <约束名>]  NOT NULL
    

1.2、修改非空约束

ALTER TABLE table_name
alter column_name column_type null | not null
table_name:要修改非空约束的表名
column_name:要修改非空约束的列名
column_type:要修改非空约束的列类型
null | not null:修改为空或非空
例:
USE TEST1
ALTER TABLE Agent
alter column Age int not null

2、主键约束

  • 通过定义PRIMARY KEY约束来创建主键

2.1、创建主键约束

(1)在创建表时创建主键约束
USE TEST1
CREATE TABLE [dbo].[Tb1](
[ID][int]CONSTRAINT PK_ID PRIMARY KEY,
[Name][char](50),
[Sex][char](2),
[Age][int]
)
-- CONSTRAINT PK_ID PRIMARY KEY为创建一个主键约束,PK_ID为用户自定义的主键约束名称,该名称需是合法的标识符。
(2)在现有表中创建主键约束
ALTER TABLE table_name
ADD 
CONSTRAINT constraint_name
PRIMARY KEY[CLUSTERED | NONCLUSTERED]
{(Columns[,...n])}
CONSTRAINT:创建约束的关键字
constraint_name:创建约束的名称
PRIMARY KEY:表示所创建的约束的类型为主键约束
CLUSTERED | NONCLUSTERED:是表示为 PRIMARY KEY或 UNIQUE约束创建集聚或非集聚索引的关键字。
例:
USE TEST1
ALTER TABLE Agent
ADD CONSTRAINT ZJ_ID PRIMARY KEY(ID)

2.2、修改主键约束

  • 若要修改 PRIMARY KEY 约束,必须先删除现有的 PRIMARY KEY 约束,然后再用新定义重新创建该约束。

2.3、删除主键约束

  • 语法如下:

    ALTER TABLE table_name
    DROP CONSTRAINT constraint_name[,...n]
    constraint_name:主键名
    例:
    USE TEST1
    ALTER TABLE Tb1
    DROP CONSTRAINT PK_ID
    

3、唯一约束

  • 唯一约束 UNIQUE 用于强制实施列集中的值的唯一性。根据 UNIQUE 约束,表中的任何两行都不允许有相同的列值。另外,主键也强制实施唯一性,但主键不允许 NULL 作为一个唯一值。

3.1、在创建表时创建唯一约束

  • 例子:

    USE TEST1
    CREATE TABLE[dbo].[Employee]( --创建表
    [ID][int]CONSTRAINT UQE_ID UNIQUE,  --设置唯一约束
    [Name][char](50),
    [Sex][char](2),
    [Age][int]
    )
    

3.2、在现有表中创建唯一约束

  • 其语法如下:

    ALTER TABLE table_name
    ADD CONSTRAINT constraint_name
    UNIQUE[CLUSTERED | NONCLUSTERED]
    {{column[,...n]}}
    
    参数说明
    table_name:要创建唯一约束的表名称
    constraint_name:唯一约束名称
    column:要创建唯一约束的列名称。
    例子:
    USE TEST1
    ALTER TABLE Agent
    ADD CONSTRAINT Unique1_ID  --设置唯一约束
    UNIQUE(ID)
    

3.3、修改唯一约束

  • 若要修改唯一约束,必须首先删除现有的 UNIQUE 约束,然后用新定义重新创建。

3.4、删除唯一约束

  • 语法如下:

    ALTER TABLE table_name
    DROP CONSTRAINT constraint_name[,..n]
    
    --例子
    USE TEST1
    ALTER TABLE Tb1
    DROP CONSTRAINT Unique_ID
    

4、检查约束

  • 检查约束 CHECK 可以强制域的完整性;CHECK 约束类似于 FOREIGN KEY 约束,可以控制放入列中的值;但是,他们在确定有效值的方式上有所不同:FOREIGN KEY 约束从其他表获得有效值列表,而 CHECK 约束通过不急于其他列中的数据的逻辑表达式确定有效值。

4.1、创建检查约束

(1)在创建表时创建检查约束
  • 例子:

    USE TEST
    CREATE TABLE [dbo].[Employee1](
    [ID][int]CONSTRAINT Unique2_ID UNIQUE,
    [Name][char](50),
    [Sex][char](2)CONSTRAINT CK_Sex Check(sex in('男','女')),
    [Age][int]
    )
    
(2)在现有表中创建检查约束
  • 语法如下:

    ALTER TABLE table_name
    ADD CONSTRAINT constraint_name
    CHECK(logical_expression)
    
    参数说明
    table_name:要创建检查约束的表名称
    constraint_name:检查约束名称
    logical_expression:要检查约束的条件表达式
    
    例子:
    USE TEST
    ALTER TABLE [Tb_student]
    --ADD CONSTRAINT Check_Sex Check(性别 in('男','女'))
    ADD CONSTRAINT CK_tz Check(统招否 in(1,0))
    
检查约束.PNG

4.2、修改检查约束

  • 修改表中某列的 CHECK 约束使用的表达式,必须先删除现有的 CHECK 约束,然后使用新定义重新创建,才能修改 CHECK 约束。

4.3、删除检查约束

  • 删除检查约束的语法如下:

    ALTER TABLE table_name
    DROP CONSTRAINT constraint_name[,...n]
    
    --例子
    USE TEST
    ALTER TABLE Employee1
    DROP CONSTRAINT CK_Sex
    

5、默认约束

  • 在创建或修改表时可通过默认约束 DEFAULT 来创建默认值。默认值可以是计算结果为常量的任何值,设置了默认值后将会为所在列的每一行分配一个默认值。

5.1、创建默认约束

(1)在创建表时创建默认约束
  • 语法如下:

    USE TEST
    CREATE TABLE[dbo].[temp](   --创建表
    [ID][int],
    [Name][char](50),
    [Sex][char](2)CONSTRAINT Default_Sex Default'男', --设置默认约束
    [Age][int]
    )
    USE TEST
    INSERT INTO Temp(ID,Name,Age)VALUES(1, '彭友聪', 21)
    /****** Script for SelectTopNRows command from SSMS  ******/
    SELECT TOP (1000) [ID]
          ,[Name]
          ,[Sex]
          ,[Age]
      FROM [TEST].[dbo].[Temp]
    
默认约束.PNG
(2)在现有表中创建默认约束
  • 其语法如下

    ALTER TABLE table_name
    ADD CONSTRAINT constraint_name
    DEFAULT constraint_expression[FOR column_name]
    --参数说明
    --table_name:要创建默认约束的表名称
    --constraint_name:默认约束名称
    --constraint_expression:默认值
    --例子
    USE TEST
    ALTER TABLE [Tb_student]
    ADD CONSTRAINT Default_age --设置默认约束
    DEFAULT 22 FOR 年龄
    

5.2、修改默认约束

  • 修改表中某列 Default 约束使用的表达式,必须首先删除现有的 Default 约束,然后使用新定义重新创建,才能修改 Default 约束。

5.3、删除默认约束

  • 删除默认约束的语法如下:

    ALTER TABLE table_name
    DROP CONSTRAINT constraint_name[,...n]
    
    --例子
    USE TEST
    ALTER TABLE Temp
    DROP CONSTRAINT Default_Sex
    

6、外键约束

6.1、创建外键约束

(1)在创建表时创建
CREATE TABLE Pyc(
    [ID][int],
    [Wage][money],
    CONSTRAINT FKEY_ID
    FOREIGN KEY(ID)
    REFERENCES Temp(ID)   --外键约束
    )
(2)在现有表中创建
  • 语法如下

    ALTER TABLE table_name
    ADD CONSTRAINT constraint_name
    [FOREIGN KEY]{(column_name[,..n])}
    REFERENCES ref_table[(ref_column_name[,...n])]
    
  • 参数说明如下表

    参数 描述
    table_name 要创建外键的表的名称
    constraint_name 外键约束的名称
    FOREIGN KEY REFERENCES 为列中的数据提供引用完整性的约束。ROFEIGN KEY 约束要求列中的每个值在被引用的表中对应的被引用列都存在;FOREIGN KEY 约束只能引用被引用表中为 PRIMARY KEY 或 UNIQUE 约束的列或被引用表中在 UNIQUE INDEX 内引用的列。
    ref_table FOREIGN KEY 约束所引用的表名
    (ref_column_name[,...n]) FOREIGN KEY 约束所引用的表中的一列或多列
  • 例子:

    USE TEST1
    ALTER TABLE Tb1
    ADD CONSTRAINT Fkey_ID
    FOREIGN KEY(ID)
    REFERENCES Agent(ID)
    

6.2、修改外键约束

  • 修改表中的外键约束,必须先删除现有的外键约束,然后再用新定义创建外键约束。

6.3、删除外键约束

  • 语法如下:

    ALTER TABLE table_name
    DROP CONSTRAINT constraint_name[,..n]
    
    --例子
    USE TEST
    ALTER TABLE Pyc
    DROP CONSTRAINT FKEY_ID
    

二、关系的创建与维护

  • SQL Server 2017 是一个关系数据库管理系统,当数据库中包含多个表时,需要通过主关键字来建立表间的关系,使各表之间协调工作。

  • 关系是通过匹配键列中的数据而工作,而键列通常是两个表间具有相同名称的列,在数据表间创建关系可以显示某个表中的列连接到另外一个表中的列。

  • 表与表之间存在如下关系

    1)一对一关系

    2)一对多关系

    3)多对多关系

1、一对一关系

  • 一对一关系是指表 A 中的一条记录确实在表 B 中有且只有一条相匹配的记录。
  • 此关系有以下特点
  • 1)分割一个含有许多列的表。
  • 2)出于安全考虑而隔离表的某一部分。
  • 3)存储可以很容易删除的临时数据,只需要删除表即可删除数据这些数据。
  • 4)存储只应用于主表子集的信息。
  • 5)如果两个相关列都是主键且具有唯一约束。

1.1、创建一对一关系

  • 1)启动 SQL Server Management Studio,并连接到 SQL Server 2017 中的数据库
  • 2)选定需要创建表关系的数据库
  • 3)选定需要建立关系的数据表,右键选择“设计”命令,打开表设计窗口,右键单击 ID 字段,在弹出的快捷菜单中选择“关系”命令,打开“外键关系”对话框
  • 4)在外键关系对话框中,单击常规下面的“表和列规范”文本框中的浏览按钮,打开“表和列”对话框,在该对话框设置关系名及主外键的表
  • 5)在“表和列”对话框,单击确定按钮;外键关系对话框中单击关闭。
表列关系.PNG
  • 一对多、多对多的关系的创建类似上述方法。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容