sql server系列_01表和约束

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介: sql server系列_01表和约束

一、通过sql命令建表和主外键约束



  create table dept
  ( 
    dept_id int primary key,
    dept_name nvarchar(100) not null,
    dept_address nvarchar(100)
  )
  create table tmp
  ( --不能写成{
    emp_id int constraint pk_id_haha primary key,
    -- 可以在定义主键的同时指定主键的名字,任何一个约束都有一个名字,不指定的话会有一个默认的名字
    --C语言是先写类型再写名字,这里刚好相反,因为数据库不是源自于C语言
    emp_name nvarchar(20) not null,
    -- 关于nvarchar类型:n表示国际化的编码,var表示的是变量,char表示字符类型
    -- 整体表示:可以支持汉字的,字符长度是随着输入的字符长度变化的类型。
    -- 后面的20表示字符长度最大为20个。
    -- 如果存储的类型是汉字,就必须加上n,否则可能会出问题
    -- 不允许为空,因此写not null
    emp_sex nchar(1),
    -- 由于性别只有男和女,因此只需要1个字符
    -- 同时由于是汉字,因此前面加上n
    dept_id int constraint fk_dept_id_heihei foreign key references dept(dept_id),
    -- 注:在SQL Server里面逗号写不写都可以,但是在oracle里面最后不能写逗号,否则报错
    )

【1】关于主键与类型写法


可以在定义主键的同时指定主键的名字,任何一个约束都有一个名字,不指定的话会有一个默认的名字

C语言是先写类型再写名字,这里刚好相反,因为数据库不是源自于C语言

【2】关于nvarchar(20) not null:


n表示国际化的编码,var表示的是变量,char表示字符类型

整体表示:可以支持汉字的,字符长度是随着输入的字符长度变化的类型。

后面的20表示字符长度最大为20个。

如果存储的类型是汉字,就必须加上n,否则可能会出问题

如果不允许为空,则写not null

【3】关于nchar(1):


由于性别只有男和女,因此只需要1个字符

同时由于是汉字,因此前面加上n

【4】关于最后一个变量后面是否可以加逗号:


注:在SQL Server里面逗号写不写都可以,但是在oracle里面最后不能写逗号,否则报错


33fc238223cd4cc1a3c041e65975c329.png7e8d21902990417a8feb39a293d2cf03.png

删除banji表

drop table banji


二、详细阐述主外键约束的作用



什么是约束:

【1】定义:对一个表中的属性操作的限制叫做约束

【2】分类:

  • 主键约束:不允许重复元素,避免了数据的冗余
  • 外键约束:通过外键约束,从语法上面保证了本事物所关联的其他事物一定是存在的。
  • 事物和事物之间的关系是通过外键来体现的


三、check约束及其作用



check约束:保证事物的取值在合法的范围之内。

  create table student
  (
    stu_id int primary key,
    stu_sal int check (stu_sal>1000 and stu_sal<8000)
  )

5e8d93d5fd634f849d2e73ef7fb4b8ba.png

向student表添加数据:

insert into student values(1,500)

9747682df1ec45fa9e852c3a3398668a.png


四、default约束及其作用



【1】default

default约束:保证事物的属性一定会有一个值。

  create table student1
  (
    stu_id int primary key,
    stu_sal int check (stu_sal>=1000 and stu_sal<=8000),
    stu_sex nchar(1) default('男')
    -- ()括号可以省略,并且在数据库当中,字符串必须使用''括起来的
  )

插入一条数据,但是没有对性别赋值,由于default的作用,因此会自动赋值为男

insert into student1(stu_id,stu_sal) values(1,5000)


bbf60e1296cd42e68543d80a5013b65f.png


数据库里面的单引号和双引号的区别:

  • 单引号:用来标识字符串
  • 双引号:用来模拟一个对象的名字,比如表,约束等的名字
  • 如果为某一个事物起名字,则使用双引号,表示字符串则使用单引号
  insert into student1(stu_id,stu_sal) values(1,5000)
  insert into student1 values (2,6000,'女')
  insert into student1 values (3,6000) # 报错,因为不指定则默认是向所有的列插入数据

1e40c6fffdf947e9b1c041005587fd99.png


【1】null与default的区别

【1】相同点:都允许用户不赋值

【2】不同点:

  • null修饰的字段如果用户不赋值,则默认为NULL
  • default修饰的字段如果用户不赋值则默认为default指定的那个值

【3】null表示空,与0不同


五、唯一约束及其作用



唯一约束:保证了事物属性的取值不允许重复,但允许为空值

    create table student2
  (
    stu_id int primary key,
    stu_sal int check (stu_sal>=1000 and stu_sal<=8000),
    stu_sex nchar(1) default('男'),
    stu_name nvarchar(200) unique --表示姓名是唯一值,不能重复
  )
  insert into student2 values (1,6000,'女','张三')
  insert into student2 values (2,6000,'女','张三')

dd8a828cea1a445ca0d30c05060b7c55.png


主键和唯一约束的区别:

【1】主键不能有空值,唯一键可以有空值,但只能有唯一一个空值

28c967b284424fada7bbb4e4b94c9ea3.png

unique和not null可以一起使用,这样就保证了唯一且不为空值:


【1】not null

not null :


【1】表示非空,则必须为属性赋值


【2】如果一个字段没有写not null也没有写null,则默认该属性能够为空,不会报错


【3】如果没有写not null,也没有为该字段赋值,则该字段默认值为NULL

c5be1b5686f44a238c53e3e717421b29.png


【2】identity

关于identity:

identity表示该字段的值会自动更新,不需要我们维护,通常情况下我们不可以直接给identity修饰的字符赋值,否则编译时会报错

create table student2
(
  sid int primary key identity(20,5),
  sname nchar(8) not null,
  ssex nchar(1)
)
insert into student2(sname,ssex) values ('张三','男');
insert into student2 values ('李四','女');--可以省略列名
insert into student2 values ('王五','女');

0020063bb2f24fb180267ebcfc976075.png


六、表,约束和关系



  1. 表和约束的区别:


【1】数据库是通过表来解决事物的存储问题


【2】数据库通过约束来解决事物取值的有效性和合法性问题


【3】建表的过程就是指定事物属性及其事物属性各种约束的过程


什么是关系

【1】定义:表与表之间的联系


【2】实现方式:通过设置不同形式的外键来体现表和表之间的不同关系


分类

【1】一对一

既可以把表A的主键当成表B的外键

也可以把表B的主键当成表A的外键


【2】一对多

把表A的主键充当表B的外键(在多的一方添加外键)


【3】多对多

一对一或者一对多可以在某一张表上面添加外键的方式来实现,而多对多则必须通过一张表来实现。即多对多必须通过C表来体现A表和B表的关系。

bf73679225dd41728a7b8703dd15e9ca.png427116f5814e4adbb27e9c26fb4b6461.png9d313ef21009407f858d92c340577177.png9d313ef21009407f858d92c340577177.png

  create table banji
  (
    banji_id int primary key,
    banji_num int not null,
    banji_name nvarchar(100)
  )
  create table jiaoshi
  (
    jiaoshi_id int primary key,
    jiaoshi_name nvarchar(100)
  )
  --第三张表 用来模拟班级和教师的关系
  create table jiaoshi_banji_mapping
  (
    -- 创建复合主键
    banji_id int constraint fk_banji_id foreign key references banji(banji_id),
    jiaoshi_id int  foreign key references jiaoshi(jiaoshi_id),
    kecheng nvarchar(20),
    constraint pk_banji_id_jiaoshi_id primary key (banji_id,jiaoshi_id)
  ) 


相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
9月前
|
SQL
重置SQLSERVER表的自增列,让自增列重新计数
重置SQLSERVER表的自增列,让自增列重新计数
137 0
|
1月前
|
SQL 数据库
sqlserver建库建表建约束,删库删表删约束的示例总结
sqlserver建库建表建约束,删库删表删约束的示例总结
12 0
|
1月前
|
数据库
SQLSERVER 2014 删除数据库定时备份任务提示失败DELETE 语句与 REFERENCE 约束“FK_subplan_job_id“冲突
SQLSERVER 2014 删除数据库定时备份任务提示失败DELETE 语句与 REFERENCE 约束“FK_subplan_job_id“冲突
|
1月前
|
SQL 关系型数据库 数据库
Flink CDC产品常见问题之SQLserver cdc 开启 cdc表没有记录如何解决
Flink CDC(Change Data Capture)是一个基于Apache Flink的实时数据变更捕获库,用于实现数据库的实时同步和变更流的处理;在本汇总中,我们组织了关于Flink CDC产品在实践中用户经常提出的问题及其解答,目的是辅助用户更好地理解和应用这一技术,优化实时数据处理流程。
|
3月前
|
SQL 数据安全/隐私保护 Python
SQL Server常见的约束条件
SQL Server常见的约束条件
58 0
|
5月前
|
数据库
Mac SQLServer删除数据库中所有的表
Mac SQLServer删除数据库中所有的表
29 0
|
9月前
|
SQL 存储 数据库
SQL Server——规则是什么?规则和约束有什么不同?
是单独的SQL Server对象,可以关联到一个或几个表中的一列或几列。它可以使用多种方式来完成对数据值的检验,可以使用函数返回验证信息,也可以使用关键字BETWEEN、LIKE和IN完成对输入数据的检查
|
9月前
|
SQL 存储 XML
数据库视频第四章(sql server 2008数据类型、对于表的管理、规则的创建与删除)
数据库视频第四章(sql server 2008数据类型、对于表的管理、规则的创建与删除)
75 0
sql server 获取自增列下一个值或者获取指定表的主键值
sql server 获取自增列下一个值或者获取指定表的主键值
|
存储 SQL Go