操作语句(Operation Statement)
操作数据库
创建数据库
关键字:create database
用于创建各种数据库对象(数据库、表、触发器、存储过程等) 格式如:
create <对象类型> <对象名称>
create database 数据库名称
on primary
(
name='主文件名' ,
size=初始化大小 按kb、mb、gb、tb设置 ,
maxsize=最大容量 unlimited(无限)/ 按kb、mb、gb、tb设置 ,
filegrowth=文件增长率 按%设置 ,
filename='主文件存放路径' 如'd:\base\base.mdf' ) ,
(
name='辅助文件名',
size=初始化大小 按kb、mb、gb、tb设置 ,
maxsize=最大容量 unlimited(无限)/ 按kb、mb、gb、tb设置 ,
filegrowth=文件增长率 按%设置 ,
filename='辅助文件存放路径' 如'd:\base\base.ndf' )
log on
(
name='主日志文件',
size=初始化大小 按kb、mb、gb、tb设置 ,
maxsize=最大容量 unlimited(无限)/ 按kb、mb、gb、tb设置 ,
filegrowth=文件增长率,
filename='主日志文件存放路径' 如'd:\base\base.ldf'
) * 其中辅助文件和主日志文件为可选项,只创建数据库主文件就可以了
如果没有创建主日志文件,系统将自动创建一个。如果手动创建主日志文件,最好将其存放在与主数据库文件不同的磁盘上 这样,当数据库主文件虽在的磁盘故障时,日志文件可以恢复数据库
create database mydb1
on primary ( name='mydb1', filename='c:\mydb1.mdf', size=10,maxsize=50,filegrowth=5 )
log on ( name='mydb1Log',filename='c:\mydb1Log.ldf',size=5,maxsize=25,filegrowth=5 )
修改数据库
关键字:alter
增加辅助文件
alter database 数据库名称
add file(name='',size=,maxsize=,filewgrowth=,filename=) , (n……)
多个辅助文件之间用括号括起来并使用逗号分开即可
增加日志文件
alter database 数据库名称
add log file(name='',size=,maxsize=,filewgrowth=,filename=) , (n……)
多个日志文件之间用括号括起来并使用逗号分开即可
增加文件组
alter database 数据库名称
add filegroup 组名
删除数据库
可以在其他任意一个数据库中使用它,但不能在要删除的数据库中使用这个命令
drop database 数据库名称
删除文件
alter database 数据库名称
remove file 文件逻辑名
删除组
alter database 数据库名称
remove filegroup 组名
修改文件
alter database 数据库名称
modify file(name=,size=,maxsize=,filwgrowth=,filenamme=)
* 修改时 修改的size只能改大,不能改小。
修改数据库名称
alter database 数据库名称
modify name=重命名
修改文件组名称
alter database 数据库名称
modify filegroup 存在的组名
name=新的组名
切换数据库
use 数据库名称
操作表
创建表
关键字:create table
craete table [ 数据库名称 [ .数据库所有者 ] ] 表名称
(
列名称 数据类型 [ null [ not null ] ] [ identity(种子,增量) ] [primarykeyName primary key]
[ rowGuidcol ] [ collate 顺序名 ] [ 列约束 ]
[列名称 as 计算表达式]
[ 表约束 ]
) [ on [ 文件组 ] [ default ] ] [ textImage_on [ 文件组 ] [ default ] ]
create table 产品
(
编号 int not null ,
产品名称 nvarchar(2) ,
数量 int,
单价 int,
总价 as 数量*单价
) create table 新闻
{
编号 int identity(1,1) not null,
标题 varchar not null,
内容 text not null,
时间 datatime
}
给表定义列时,约束、数据类型、标识、主键无顺序限制,可随意写,比如:
create table Teacher(
教师编号 int identity primary key not null
)
--也可以写成
create table Teacher(
教师编号 not null int primary key identity
)
identity
系统为该列自动生成的唯一性的标识数据,种子一般从1开始,增量默认为1,可以更改种子和增量。标识列不允许用户insert数据,除非使用set identity_insert=on来开启自定义插入标识,插入标识操作只支持insert不支持update。获取最近一次系统生成的identity值:select @@identity as 列别名。
not for replication
复制
rowGUIDcol
GUI全局唯一标识符,此关键字用于这样额情况,比如当要把当前数据库的某张表的数据复制到另一个数据库的表时,因为两张表都有identity自动标识列,此时如果当前表有唯一标识100,另一张表也有这个标识,那么就会出现错误,此时可以使用rowGUIDcol来解决这样的问题。
collate
数据排序、区分大小写、区分重音。
列名 as 计算表达式
这个设定可以让表自动生成一个列,此列的数据是基于你的计算表达式来生成的。
列约束和表约束
列约束即把设置的约束放在列名-数据类型之后,表约束放在创建表的语句括号内的最后位置。
on [ 文件组 ] [ default ]
如果不设置on,或值为default,默认将把表关联到主文件组里,否则按自定义的设置将表关联到其他文件组。
textImage_on [ 文件组 ] [ default ]
与on类似,不过只有当表中定义了text、image数据类型的列时,这个子句才是可用的,它会把BLOB数据移动到不同的文件组中,通过把数据库分成多个文件并将这些文件存储在不同的物理磁盘上可以重大提升性能I/O。
重命名表
exec sp_rename '原表名','新表名'
删除表
一次可删多个表 使用逗号隔开
drop table 表名,表名2,……
修改表 - 为表增加列
alter table 表名称
add 列名称 数据类型 null [约束][,n……]
* 追加的列必须允许空值存在,否则需要给出默认值 。增加多列使用逗号隔开。 alter table Article
add body varchar()
修改表 - 为表删除列
alter table 表名称
drop column
列名称[,n……]
*有约束的列需要先删除约束才能删除列,删除多列使用逗号隔开
修改表 - 为表修改列
alter table 表名
alter column
列名 修改操作…… alter table student
alter column
学号 varchar(20)
* 修改列只能修改其数据类型,不能修改约束,被约束的列不能修改,除非先删除约束。
约束
约束指通过限制字段中的数据来保证数据的完整性,即为列字段指定一个约束规则,使其只能录入指定规则的数据。
主键约束:primary key
主键约束在一个表中可以定义一个/或多个列(但使用视图模式定义时只能定义一个主键约束列,最好只定义一个)。被定义了主键约束的列不允许有空值,所以必须指定值为not null。被定为主键约束的列具有唯一可以代表它所在行的一组数据的能力。
create table 表名
(
列名 数据类型 是否可空 identity(种子,增量) 自定义的主键名 primary key,
……
) create table 成绩
(
ID int not null identity(1,1) constraint pk_ID primary key,
英语 int not null,
数学 int not null,
总分 as 英语+数学
)
外键约束 Foreign key
使用外键约束可使多个表之间建立起联系,多个表之间其中必有一个列的数据是相同的。比如学员等级表和学员成绩表,它们都以学员ID作为联系。被foreign key约束的表称为主
表的外键表,references指向的表称为主表。
规则
1.主键表不能删除,因为有外键表需要引用它,除非先删除外键表的外键约束,或者使用级联删除。
2.insert数据到外键表里,必须保证外键表中的外键列的数据是主键表对应的列里已经有的数据,如果外键表的外键列的数据在主键表中不存在则会提示错误。
表自引用
一张表可以引用它自身,可如下定义:
create table 员工
(
员工ID int identity not null ,
名称 varchar(20) not null,
经理ID int null foreign key references 员工 ( 员工ID )/*外键列允许null*/
)
级联操作
delete或update主表某行数据,是否同时delete或update外键表相关联的数据。必须在创建表、定义外键约束时设置是否可级联操作,如果定义为on delete(update)cascade,表示允许
级联操作自动删除或更新相关联的表的数据。如果定义为on delete(update)action,表示不允许删除或更新主表的数据。
create table 供应商
(
ID int not null identity primary key,
供应商编号int not null unique,
名字varchar(50) not null
) create table 食品
(
ID int not null identity primary key,
名称varchar(50) not null,
供应商ID int foreign key references 供应商(供应商编号)
on delete cascade
) /*以上创建了外键表食品和主表供应商,在食品表的外键约束中,定义了on delete cascade 子句,规定了主表相关数据被删除时自动执行级联删除*/
检查约束:Check
Check约束可以在指定的列上检查该列的值是否满足Check的条件。
create table 成绩
(
ID int not null identity primary key,
sex varchar(2) not null check(sex ='男' or sex='女'),
english int not null check(english>60),
)
唯一约束:Unique
nique可以出现在多个列上,它要求被约束的列的数据具有唯一性,不能重复,如果该列允许null值 同时又使用了Unique约束,那么null值可出现最多一次。
create table 成绩
(
ID int not null identity primary key,
name varchar(10) not null unique
)
nique也可以同时约束多个列,如果为多个列指定了同一个名称的nique约束,那么新插入的数据的三个具备同一个约束的字段就不能与已经存在的记录的对应的列值相同。以下代码中cell_1、cell_3、cell_3三个列具有同一个约束,假设有一条存在的记录对应了这三个列的值分别是香蕉、菠萝、荔枝,那么新插入的数据就不能是香蕉、菠萝、荔枝,因为他们被约束为不能同时相等。
alter table Tab add constraint uq_fruit unique(cell_1,cell_2,cell_3)
默认约束:Default
如果不插入数据到被dedault约束的列,你可以给定一个默认值。
create table 成绩
(
ID int not null identity primary key,
name varchar(10) not null unique ,
english int not null check(english>60),
midifyTime smalldatetime default getdate()
) insert into 成绩(name,english)values('lily',100)
insert into 成绩(name,english,midifyTime )values('leo',100,'2012-12-12')
增加约束:Add
表已经建好,之后想要修改表为表增加约束,可alter表并add约束。
增加主键约束
alter table 表名称
add constraint 自定约束标识名称
primary key(列名称)
增加外键约束
alter table 表名称
add constraint 自定约束标识名称
foreign key (列名称) references 被引用的表名称(列名称)
增加检查约束
alter table 表名称
add constraint 自定约束标识名称
check (列名称+条件)
增加唯一约束
alter table 表名称
add constraint 自定约束标识名称
unique (列名称)
增加默认约束
alter table 表名称
add constraint 自定约束标识名称
default 默认值 for 列名称
旧数据忽略新约束:with nocheck
在为某个列创建约束时,该列可能之前没有约束并且已经有了数据,此时你想约束这个列。比如联系表的电话一列,以前填写的是'0871-00-78-90',现在你想要约束为这种格
式:'9028392'。但因为以前的旧数据不满足现在的约束条件,所以约束将无法创建,此时可以使用约束忽略语句来忽略旧数据,只约束新录入的数据。
alter table 联系
with nocheck/*不检查表里以前的所有数据*/
add constraint cn_phone/*添加约束*/
check( (len(phone) =7) and (phone between 111111 and 9999999) )
新数据禁用旧约束
如果插入的新数据不满足之前已经存在的约束,可临时禁用约束,直到数据插入完成后再启用。
临时禁用约束
关键字:nocheck
alter table 表名称
nocheck
constraint 约束标识名称 重新启用约束
关键字:check
alter table 表名称
check
constraint 约束标识名称