文章目录
- 一、建表注意事项
- 1.1 数据类型
- 1.2 建立数据表的基本SQL语法
- 二、实例说明
- 2.1 创建数据表
- 2.2 实例2
- 三、标识列和主键
- 示例:
一、建表注意事项
1.1 数据类型
可以看这个去了解数据类型:
1.2 建立数据表的基本SQL语法
建立数据表的基本 SQL 语法如下:
creat table table_name (
column1 datatype [constraint],
column2 datatype [constraint],
column3 datatype [constraint],
...
);
这里是各部分的详细说明:
create table
: 这是一个 SQL 命令,用于创建新表。table_name
: 所创建的表的名称。column1
,column2
,column3
, … : 这些是你想在表中创建的列的名称。datatype
: 每列的数据类型,例如int
、varchar
、date
等。constraint
: 可选项,用于定义列的规则,如not null、
primary key 、
foreing key、unique
、check
、default
等。
二、实例说明
现在我们通过建立几个数据表来进行详细的说明
2.1 创建数据表
use StudentManageDB
go
if exists(select * from sysobjects where name='Students')
drop table Students
go
create table Students
(
StudentID int identity(10000,1),--学号
StudentName varchar(20)not null,--姓名
Gender char(2) not null,--性别
Birthday datetime not null,--出生日期
StudentIdNo numeric(18,0)not null,--身份证号
Age int not null,--年龄
PhoneNumber varchar(50),
StudentAddress varchar(500),
ClassId int not null --班级
)
go
这段SQL语句在SQL Server数据库中创建一个新的数据表名为“Students”,用于存储学生信息。下面是这段SQL语句的详细分析和说明:
-
use StudentManageDB
: 这条命令指示SQL Server使用名为StudentManageDB
的数据库,因为建表通常需要在已经存在的数据库内进行。所有接下来的操作都将在这个数据库上进行。创建数据表在第二节 -
go
:GO
是一个批处理命令,用于分隔批处理SQL Server语句。SQL Server Management Studio和一些其他SQL界面用它来标识一组一起执行的命令的结束。它不是SQL语句,而是一个命令指令。 -
if exists(select * from sysobjects where name='Students') drop table Students
: 这条语句检查名为“Students”的表是否存在于数据库中。如果存在,它会执行drop table Students
命令来删除这个表。这样能确保创建新表时不会因为一个同名的表已经存在而出现错误。 -
go
: 再次使用GO
指令来结束上一批命令。 -
create table Students
: 这条命令开始创建一个新的表“Students”。表中包含以下字段:StudentID
: 学号,设定为自动增长的整数类型。identity是标识列(后面讲),起始值为10000,每次新增一条记录,ID值增加1。看数据类型点这个StudentName
: 学生的姓名,它是一个变长字符串(varchar
),最多可包含20个字符,并且不允许为空(not null
)。Gender
: 性别,设定为固定长度为2的字符类型(char
),不允许为空。Birthday
: 出生日期,使用datetime
类型来存储日期和时间数据,不允许为空。StudentIdNo
: 学生的身份证号码,它是一个数值型字段(numeric
),最多18位数字,没有小数位,并且不允许为空。Age
: 学生的年龄,是一个整数类型的字段,不允许为空。PhoneNumber
: 学生的联系电话,是一个变长字符串,最多可以包含50个字符。StudentAddress
: 学生的地址,是一个更长的变长字符串,最多可包含500个字符。ClassId
: 班级编号,是一个整数类型的字段,不允许为空。它建立了一个关联到另一张表(假设为班级信息表)的外键关系。
-
go
: 这条指令结束了创建表的命令批次。
2.2 实例2
if exists(select * from sysobjects where name='ScoreList')
drop table ScoreList
go
create table ScoreList
(
Id int identity(1,1)primary key,
StudentId int not null,--学号外键
CSharp int null,
SQLServer int null,
UpdataTime datetime not null --更新时间
)
go
首先,在SQL 脚本中,Id
列被直接定义为主键。
Id int identity(1,1) primary key,
在这行中,Id
列的定义包含了关键词 primary key
,这明确地将 Id
列设置为 ScoreList
表的主键。因此,每当向 ScoreList
表插入新记录时,Id
列将自动增加(从1开始,每次增加1),并且保证每一条记录的 Id
值都是唯一的。
identity(1,1)
部分是 SQL Server 特有的语法,它指定 Id
列是一个自动增长的标识列,起始值为1,每次新增记录时自动增长的步长也是1。
我们可以查看创建的数据表:
把第一行填完后使用Enter键,自动生成1
-
CSharp int null,
这表示
ScoreList
表中有一个名为CSharp
的列,它的数据类型是int
(整数)。null
关键字表示这个字段能够存储NULL
值,即该字段不是必须的,可以没有值。在数据库中,NULL
是一个特殊的标记,表示字段的值是未知的或缺失的。 -
SQLServer int null,
这表示表中有一个名为 SQLServer
的列,其数据类型也是 int
。同样的,null
表示这个字段可以接受 NULL
值,即它也是一个可选的字段,不是强制必填的。
-
UpdataTime datetime not null --更新时间
这一行定义了一个名为
UpdataTime
的列,数据类型为datetime
,这意味着该字段将存储日期和时间信息。not null
关键字表示这个字段是必须的,必须要有值,不能存储NULL
。
要注意SQL中的注释,用双减号--
表示。
三、标识列和主键
标识列和主键在数据库中有不同的作用:
-
自动递增:
- 标识列:通常会有一个自动递增的属性,每当插入新的记录时,标识列的值会自动增加,这个过程是自动的,不需要用户输入。
- 主键:没有自动递增的属性,除非它被明确定义为标识列。主键的值可以是手动插入的,比如在使用复合主键或者业务逻辑要求使用特定格式的键值时。
-
唯一性:
- 标识列:虽然标识列的值是唯一的,因为每次插入都会增加,但是标识列本身并不强制唯一性,除非它也被指定为主键。
- 主键:保证了表中每一行的唯一性,这是数据库强制的约束,不允许有两行具有相同的主键值。
-
NULL值:
- 标识列:通常不允许NULL值,因为它旨在为每一行提供一个唯一的标识符。
- 主键:同样不允许NULL值,因为每行都需要有一个明确的标识符来维护数据完整性。
-
显示在查询结果中:
- 标识列:当进行查询操作时,标识列的值会按照插入顺序的递增显示。
- 主键:查询结果中会显示主键字段的值,不一定是递增的,取决于主键值的插入方式。
-
索引:
- 标识列:即使是标识列,也不一定有索引,除非你创建索引或者将其设置为主键。
- 主键:默认会有一个唯一索引,以加快按主键字段的查询和排序操作。
简而言之,标识列在视觉上通常表现为一个按插入顺序递增的数字序列,而主键则是确保每行唯一且不为空的约束条件。如果主键设置为标识列,那么它就同时具备了上述两种属性。
示例:
假设我们有一个用户信息表,我们希望每个用户都有一个唯一的用户ID,并且我们希望数据库能够在新增用户记录时自动为每个用户生成这个ID。
这是创建这样一个表的SQL语句示例:
create table Users (
UserID int identity(1,1) primary key,
Username varchar(255) not null ,
Email varchar(255) not null
);
在这个例子中:
UserID
是一个标识列,因为它具有identity(1,1)
属性。这意味着每次插入新行时,UserID
会从1开始自动递增。UserID
同时也是主键,如primary key
关键词所定义的。这确保了UserID
的值在表中是唯一的,而且每个用户都会有一个唯一的标识符。
在这种情况下,UserID
字段既是标识列(保证每个用户有一个自动分配、递增的唯一ID)又是主键(保证每行数据的唯一性并且不允许空值)。然而,并非所有主键都是标识列。你可以有一个主键而没有自动递增的特性,特别是当主键为复合主键时,由多个列组合成时,通常不会使用标识列。