仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 658|回复: 8
打印 上一主题 下一主题

[学习教程] MSSQL编程:调剂SQLServer2000运转中数据库布局

[复制链接]
跳转到指定楼层
楼主
发表于 2015-1-16 22:36:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
导致了一个使用几乎和mSQL一样的API接口的用于他们的数据库的新的SQL接口的产生,这样,这个API被设计成允许为用于mSQL而写的第三方代码更容易移植到MySQL。server|sqlserver|数据|数据库|数据库布局
开辟过程当中的数据库布局布局,不成制止的会必要重复的修正。最贫苦的情形莫过于开辟者数据库布局已修正,而实践使用中数据库又有大批数据,怎样在不影响数据库中数据情形下,更新数据布局呢?固然,我们能够手工对使用数据库表布局各个增加、改正、删除的字段逐一调剂,这对一两个字段来讲,是对照复杂的,假如修改对照年夜的时分,这个历程将长短常烦琐的。本辞意在先容利用SQLServer2000T-SQL语句举行数据库布局调剂,但愿可以给列位带来些便利。上面以现无数据库表HR_User为例,解说怎样举行这类操纵。
HR_User现有布局:
[UserId][int]NOTNULL,用户Id,主键
[UserName][varchar](50)NOTNULL,用户姓名

1、数据库增加新字段
如今,必要在HR_User中增加字段用户昵称[NickName][varchar](50)不为空,出身日期[Birthday][datetime]不为空。
在开辟数据库中我们已增加了这两个字段,在查询剖析器大概企业办理器中天生新表的机关语句以下:
ifexists(select*fromdbo.sysobjectswhereid=object_id(N[dbo].[HR_User])andOBJECTPROPERTY(id,NIsUserTable)=1)
droptable[dbo].[HR_User]
GO

CREATETABLE[dbo].[HR_User](
[UserId][int]NOTNULL,
[UserName][varchar](50)COLLATEChinese_PRC_CS_ASNOTNULL,
[NickName][varchar](50)COLLATEChinese_PRC_CS_ASNOTNULL,
[Birthday][datetime]NOTNULL
)ON[PRIMARY]
GO

ALTERTABLE[dbo].[HR_User]ADD
CONSTRAINT[DF_HR_User_UserId]DEFAULT(0)FOR[UserId],
CONSTRAINT[DF_HR_User_UserName]DEFAULT()FOR[UserName],
CONSTRAINT[DF_HR_User_NickName]DEFAULT()FOR[NickName],
CONSTRAINT[DF_HR_User_Birthday]DEFAULT(getdate())FOR[Birthday],
CONSTRAINT[PK_HR_User]PRIMARYKEYCLUSTERED
(
[UserId]
)ON[PRIMARY]
GO


execsp_addextendedpropertyNMS_Description,N出身日期,Nuser,Ndbo,Ntable,NHR_User,Ncolumn,NBirthday
GO
execsp_addextendedpropertyNMS_Description,N用户昵称,Nuser,Ndbo,Ntable,NHR_User,Ncolumn,NNickName
GO
execsp_addextendedpropertyNMS_Description,N用户Id,Nuser,Ndbo,Ntable,NHR_User,Ncolumn,NUserId
GO
execsp_addextendedpropertyNMS_Description,N用户姓名,Nuser,Ndbo,Ntable,NHR_User,Ncolumn,NUserName
GO
这时候候,我们来构建使用数据库的修正语句,T-SQL修正表布局增加新字段语法为AlterTABLETableNameAdd,如许我们要增加两个字段就应当如许写:
AlterTABLE[dbo].[HR_User]Add
[NickName][varchar](50)COLLATEChinese_PRC_CS_ASNOTNULLDEFAULT(),
[Birthday][datetime]NOTNULLDEFAULT(getdate())
GO
实在两头的语句只是复杂的拷贝创立语句中对应两个字段的两句。再加上两句增加形貌的语句,就半途而废。
execsp_addextendedpropertyNMS_Description,N出身日期,Nuser,Ndbo,Ntable,NHR_User,Ncolumn,NBirthday
GO
execsp_addextendedpropertyNMS_Description,N用户昵称,Nuser,Ndbo,Ntable,NHR_User,Ncolumn,NNickName
GO
2、数据库修正字段
如今我们发明UserName、NickName字段长度不敷,必要修正为100
AlterTable[HR_User]Alter
Column[UserName][varchar](100)COLLATEChinese_PRC_CS_ASNOTNULL
GO

AlterTable[HR_User]Alter
Column[NickName][varchar](100)COLLATEChinese_PRC_CS_ASNOTNULL
GO
有了数据以后,我们就要想一个比较统一的方法来闪回。上面我们说了对于DML操作,可以通过反向执行所有逆操作来实现,对于语句里面的DDL,只能直接跳过。原因是一个DDL不一定有直接的逆操作。
分手快乐 该用户已被删除
沙发
发表于 2015-1-19 18:05:38 | 只看该作者
但是随着数据量的增大,这种成本差距会逐渐减小,趋于相等。(500万数量级只相差10%左右)
柔情似水 该用户已被删除
板凳
发表于 2015-1-25 17:10:08 | 只看该作者
其实可以做一下类比,Oracle等数据库产品老早就支持了java编程,而且提供了java池参数作为用户配置接口。但是现在有哪些系统大批使用了java存储过程?!连Oracle自己的应用都不用为什么?!
金色的骷髅 该用户已被删除
地板
发表于 2015-2-3 11:58:14 | 只看该作者
如果我们从集合论(关系代数)的角度来看,一张数据库的表就是一组数据元的关系,而每个SQL语句会改变一种或数种关系,从而产生出新的数据元的关系(即产生新的表)。
海妖 该用户已被删除
5#
发表于 2015-2-8 20:42:33 | 只看该作者
也可谈一下你是怎么优化存储过程的?
飘灵儿 该用户已被删除
6#
发表于 2015-2-26 08:56:01 | 只看该作者
另一个是把SQL语句写到服务器端,就是所谓的SP(存储过程);
冷月葬花魂 该用户已被删除
7#
发表于 2015-3-8 13:09:22 | 只看该作者
连做梦都在想页面结构是怎么样的,绝非虚言
兰色精灵 该用户已被删除
8#
发表于 2015-3-15 23:13:39 | 只看该作者
一直以来个人感觉SQLServer的优化器要比Oracle的聪明。SQL2005的更是比2k聪明了不少。(有次作试验发现有的语句在200万级时还比50万级的相同语句要快show_text的一些提示没有找到解释。一直在奇怪。)
再见西城 该用户已被删除
9#
发表于 2015-3-22 18:09:29 | 只看该作者
这就引发了对varchar和char效率讨论的老问题。到底如何分配varchar的数据,是否会出现大规模的碎片?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-22 23:36

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表