可以看这个去了解数据类型:
建立数据表的基本 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
等。现在我们通过建立几个数据表来进行详细的说明
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
: 这条指令结束了创建表的命令批次。
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值:
显示在查询结果中:
索引:
简而言之,标识列在视觉上通常表现为一个按插入顺序递增的数字序列,而主键则是确保每行唯一且不为空的约束条件。如果主键设置为标识列,那么它就同时具备了上述两种属性。
假设我们有一个用户信息表,我们希望每个用户都有一个唯一的用户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)又是主键(保证每行数据的唯一性并且不允许空值)。然而,并非所有主键都是标识列。你可以有一个主键而没有自动递增的特性,特别是当主键为复合主键时,由多个列组合成时,通常不会使用标识列。