当前位置: 首页 > news >正文

理解T-SQL:数据库表的创建、修改、删除

      这一节主要介绍使用SQL语言来进行数据库,及表的创建、修改和删除功能。使用SQL语言比使用图形界面会带来更快的效率,另外,学习好T-SQL对于写相应的脚本、存储过程都带来很大的便利。
      本节讨论了以下几个方面: 创建和修改数据库,创建和修改表,主键/外键/UNIQUE/CHECK/DEFAULT约束, 创建和修改规则和默认值.

1.创建数据库
       创建数据库,默认情况下,一条命令就可以了:Create Database dbName;
       但可以指定更多的选项来创建数据库,其命令语法格式如下:

CREATE   DATABASE   < database  name >
[ ON [PRIMARY ]
(
[ NAME = <’logical file name’>, ]
FILENAME 
=   < file  name’ >
[ , SIZE = <size in kilobytes, megabytes, gigabytes, or terrabytes> ]
[ , MAXSIZE = size in kilobytes, megabytes, gigabytes, or terrabytes> ]
[ , FILEGROWTH = <kilobytes, megabytes, gigabytes, or terrabytes|percentage> ] )]
[ LOG ON
([NAME = <’logical file name’>,
]
FILENAME 
=   < file  name’ >
[ , SIZE = <size in kilobytes, megabytes, gigabytes, or terrabytes> ]
[ , MAXSIZE = size in kilobytes, megabytes, gigabytes, or terrabytes> ]
[ , FILEGROWTH = <kilobytes, megabytes, gigabytes, or terrabytes|percentage> ] )]
[  COLLATE <collation name>  ]
[  FOR ATTACH [WITH <service broker> ] |   FOR  ATTACH_REBUILD_LOG |   WITH  DB_CHAINING {
ON | OFF  }  |  TRUSTWORTHY {  ON | OFF  }]
[ AS SNAPSHOT OF <source database name> ]
[ ; ]


      以上,需要介绍的是SIZE表示是创建时数据库大小,MAXSIZE是数据库最大大小,FILEGROWTH是每次增长时的大小。默认以MB为单位。可以使用KB,GB,TB等单位。
      展示一个例子:

CREATE   DATABASE  Accounting
ON
    (NAME 
=  ‘Accounting’,
     FILENAME 
=  ‘c:\Program Files\Microsoft SQL Server\MSSQL. 1 \mssql\data\AccountingData.mdf’,
     SIZE 
=   10 ,
     MAXSIZE 
=   50 ,
     FILEGROWTH 
=   5 )
     
LOG   ON
     ( NAME 
=  ‘AccountingLog’,
       FILENAME 
=  ‘c:\Program Files\Microsoft SQL Server\MSSQL. 1 \mssql\data\AccountingLog.ldf’,
       SIZE 
=  5MB,
       MAXSIZE 
=  25MB,
       FILEGROWTH 
=  5MB)
GO


     查看数据库的信息,使用以下语句执行:
exec sp_helpdb ‘Accounting’

 

2.创建表
       创建表,其命令语法格式如下:

CREATE   TABLE   [ database_name.[owner ] .]table_name
(
   
< column  name >   < data type >
   
[ [DEFAULT <constant expression> ]   |   [ IDENTITY [(seed, increment) [NOT FOR REPLICATION ] ]]]
   
[ ROWGUIDCOL ]
   
[ COLLATE <collation name> ]
   {
[ NULL|NOT NULL ]   |   [  PRIMARY KEY | UNIQUE  ] }
   
[ FOREIGN KEY ( column [ , ]  )  REFERENCES  ref_table  [  ( ref_column [ , ]  ) ]
   
[ <column constraints> ]   |   [ column_name AS computed_column_expression ]   |   [ <table_constraint> ]
   
[ ,n ]
)
[ ON {<filegroup>|DEFAULT} ]
[ TEXTIMAGE_ON {<filegroup>|DEFAULT} ]


      一般的,创建表需要指定列名,指定列名的情况下,必须指定其类型。至于支持的数据类型,可以在联机从书中搜索“数据类型”即可得到。
      还可以制定键和约束,包括DEFAULT,INDENTITY,UNIQUE,FOREIGN KEY...
      [<column constraints>]选项表示列约束,即放置在列上的限制和规则,决定什么数据能插入到列中,例如,包含月份的字段,只允许插入1-12之间的数据
      [column_name AS computed_column_expression] 表示计算列,即列没有自己的数据,而是根据其它列推导出来的。详细语法:<列名> as <计算表达式>,例如:ExtendedPrice as Price*Quantity
      [<table_constraint>]表示表约束,即对什么数据能够插入到表中进行限制,与列约束不同的是表约束可以基于一个以上的列。
      [ON]指定创建表时把表放置在哪个文件组上。
      [TEXTIMAGE_ON]把表非常特殊的部分移到另一个不同的文件组上。当表定义中有text,ntext,image列时,子句才可用。
      一个例子:

USE  Accounting
CREATE   TABLE  Customers
(
    CustomerNo 
int   IDENTITY   NOT   NULL ,
    CustomerName 
varchar ( 30 NOT   NULL ,
    Address1 
varchar ( 30 NOT   NULL ,
    Address2 
varchar ( 30 NOT   NULL ,
    City 
varchar ( 20 NOT   NULL ,
    State 
char ( 2 NOT   NULL ,
    Zip 
varchar ( 10 NOT   NULL ,
    Phone 
char ( 15 NOT   NULL
)


     查看表的信息,使用以下语句执行:
exec sp_help Customers

 

3. 修改数据库
     语法格式如下:

ALTER   DATABASE   < database  name >
ADD   FILE
(
   
[ NAME = <’logical file name’>, ]
   FILENAME 
=   < file  name’ >
   
[ , SIZE = <size in KB, MB, GB or TB> ]
   
[ , MAXSIZE = < size in KB, MB, GB or TB > ]
   
[ , FILEGROWTH = <No of KB, MB, GB or TB |percentage> ] [ ,n ]
   
[  TO FILEGROUP filegroup_name ]
   
[ , OFFLINE  ]
   
| ADD   LOG   FILE
      (
[ NAME = <’logical file name’>, ]
      FILENAME 
=   < file  name’ >
      
[ , SIZE = < size in KB, MB, GB or TB > ]
      
[ , MAXSIZE = < size in KB, MB, GB or TB > ]
      
[ , FILEGROWTH = <No KB, MB, GB or TB |percentage> ]
)
| REMOVE  FILE   < logical  file  name >   [ WITH DELETE ]
| ADD  FILEGROUP  < filegroup name >
| REMOVE FILEGROUP  < filegroup name >
| MODIFY  FILE   < filespec >
| MODIFY NAME  =   < new dbname >
| MODIFY FILEGROUP  < filegroup name >  { < filegroup property >| NAME  =< new filegroup name > }
| SET   < optionspec >   [ , ][ WITH <termination> ]
| COLLATE  < collation name >

     具体不多讲了,查询联机从书就可以
     还是举个例子来得更直白些:

ALTER   DATABASE  Accounting
   MODIFY 
FILE
     (NAME 
=  Accounting, SIZE  =  100MB)


 

4. 修改表
    修改表是经常遇到的,所以语法还是要掌握的,语法也比较复杂:

ALTER   TABLE  table_name
{
  
[ ALTER COLUMN <column_name>     --【修改列属性】
        { [<新数据类型模式>
] . < 新数据类型 >   [ (精度[, 小数位数 ] )]  max   |   < xml 模式集合 >
        
[ COLLATE <顺序名> ]    -- 校对名,排序时用到
         [ NULL|NOT NULL ]   |   [ {ADD|DROP} ROWGUIDCOL ]   |  PERSISTED}]
  
| ADD                                                -- 【增加列】
         < column  name >   < data_type >   
        
[ [DEFAULT <常量表达式> ]                -- 默认值
         | [ IDENTITY [(<种子>, <增量>) [NOT FOR REPLICATION ] ]]] 
        
[ ROWGUIDCOL ]                           -- GUID列
         [ COLLATE <collation_name> ]
        
[ NULL|NOT NULL ]
        
[ <列约束> ]
        
| [ <列名> AS <计算列表达式> ]           -- 计算列
    | ADD                                               -- 【增加约束】
         [ CONSTRAINT <约束名> ]
        { 
[    {PRIMARY KEY|UNIQUE}                 --关键字,UNIQUE约束
               [CLUSTERED|NONCLUSTERED
]          -- 聚集索引,非聚集索引
               {( < 列名 > [  , ] )}                           -- 以上几个约束在哪些列名上面
                [ WITH FILLFACTOR = <填充因子> ]
               
[ ON {<文件组> | DEFAULT} ]
           ]
           
| FOREIGN   KEY                                        -- 外键约束                       
                [ (<column_name>[ ,n ] )]                  -- 外键约束在哪些列上面
                REFERENCES   < 引用表 >   [ (<引用字段>[ ,n ] )]    -- 外键约束的引用表和字段
                [ ON DELETE {CASCADE|NO ACTION} ]              -- 当引用字段被删除时,本表外键字段所做的动作
                [ ON UPDATE {CASCADE|NO ACTION} ]              -- 当引用字段被更新时,本表外键字段所做的动作
                [ NOT FOR REPLICATION ]
          
| DEFAULT   < 常量表达式 >                              -- Default约束
                [ FOR <column_name> ]                          -- Default约束在哪个列上面
           | CHECK   [ NOT FOR REPLICATION ]                 -- Check约束
               ( < 搜索条件 > )
           
[ ,n ][  ,n ]                                              -- 可以增加更多约束
                | [ WITH CHECK|WITH NOCHECK ]
   
|  { ENABLE  |  DISABLE }  TRIGGER    {  ALL   |   < 触发器名 >   [  , ]  }
   
| DROP                                               -- 【删除列或约束】
      {   [ CONSTRAINT ]   < 约束名 >                 --  删除某个约束
           | COLUMN   < column_name > } [  ,n ]   --  删除某列
           | { CHECK | NOCHECK CONSTRAINT  { ALL|< 约束名 > [  ,n ] }
          
| {ENABLE | DISABLE}  TRIGGER   { ALL|< trigger_name > [  ,n ] }
          
|  SWITCH  [  PARTITION <source partition number expression>  ]   TO   [  schema_name.  ]  target_table
                  
[  PARTITION <target partition number expression>  ]
}

    以上,修改表代码量很多,支持的功能也多,但无外于几点:
      第一功能是修改列的相应属性,使用alter column columnName,
      第二功能是增加列,使用add column newColumnName;
      第三功能是增加约束,使用add constraint newConstraint;
      第四功能是删除列,使用 drop column columnName;
      第五功能是删除约束,使用 drop column constraint;
    以下,举个简单的例子,更多的情况留到约束时再展现:

ALTER   TABLE  Customers
   
ADD  Contact  varchar ( 25 NULL ,
           LastRaiseDate 
datetime   NOT   NULL    DEFAULT  ‘ 2005 - 11 - 07


 

5. 删除数据库和表
    非常简单,使用Drop DatabaseName / TableName; 即可。

 

6. 关于约束
    约束的方式有很多种,但每一种都属于三个类型的约束之一:实体(entity)、域(domain,)、引用完整约束(referential integrity constraints),如图所示:
constraint

    ● 域约束涉及一个或多个列,确保某一个列或一组列满足特定的标准。当插入或更新一个行时将应用该约束。
       处理CHECK约束、规则(rule)、默认值(default)约束时,属于这种类型
    ● 实体约束是关于单独行的,这种类型的约束感兴趣的是单个的行,最具代表性的例子是要求所有的行的某个列或列的组合具有唯一性约束
       处理PRIMARY KEY、UNIQUE约束时,属于这种类型
    ● 引用完整性约束是一个列中的值必须与另一个列(可以同一个表,或者不同的表)中的值相匹配。
       外键FOREIGN KEY约束是属于这种类型

 

7. 主键和外键约束
    ● 创建表时创建主键:

CREATE   TABLE  Customers
(
    CustomerNo 
int   IDENTITY   NOT   NULL   PRIMARY   KEY ,
    CustomerName 
varchar ( 30 NOT   NULL ,
    Address1 
varchar ( 30 NOT   NULL ,
    City 
varchar ( 20 NOT   NULL ,
    State 
char ( 2 NOT   NULL ,
)

    ● 在现有表上创建主键

USE  Accounting
ALTER   TABLE  Employees  ADD   CONSTRAINT  PK_EmployeeID
        
PRIMARY   KEY  (EmployeeID)

    ● 创建表时创建外键:

USE  Accounting
CREATE   TABLE  Orders
(
    OrderID 
int   IDENTITY   NOT   NULL   PRIMARY   KEY ,
    CustomerNo 
int   NOT   NULL    FOREIGN   KEY   REFERENCES  Customers(CustomerNo),
    OrderDate 
smalldatetime   NOT   NULL ,
    EmployeeID 
int   NOT   NULL
)

    ● 在现有表上创建外键

ALTER   TABLE  Orders
    
ADD   CONSTRAINT  FK_EmployeeCreatesOrder
          
FOREIGN   KEY  (EmployeeID)  REFERENCES  Employees(EmployeeID)       -- 外键引用外部的表字段
ALTER   TABLE  Employees
    
ADD   CONSTRAINT  FK_EmployeeHasManager
          
FOREIGN   KEY  (ManagerEmpID)  REFERENCES  Employees(EmployeeID)   -- 外键引用内部表字段


    ● 外键定义中的[ON UPDATE{CASCADE|NO ACTION}] 和[ON DELETE {CASCADE|NO ACTION}] 选项
        CASCADE/NO ACTION定义了两个不同的引用完整性操作,默认的情况下,NO ACTION是默认选项。
        CASCADE选项是表示级联操作,如果删除/更新了父级的记录,相应的子级的记录行也会被删除/更新。且CASCADE操作能够影响的深度没有限制。
    ● 查看表中的主键和外键约束
      exec sp_helpconstraint Orders

 

8.UNIQUE约束
    UNIQUE约束要求表中的列(或列的组合)具有唯一性。UNIQUE约束常被称为备用键。一个表中可以有不止一个UNIQUE约束,但主键约束只能有一个。
    ● 创建UNIQUE约束:

CREATE   TABLE  Shippers
(
    ShipperID 
int   IDENTITY   NOT   NULL
    
PRIMARY   KEY ,
    ShipperName 
varchar ( 30 NOT   NULL ,
    State 
char ( 2 NOT   NULL ,
    Zip 
varchar ( 10 NOT   NULL ,
    PhoneNo 
varchar ( 14 NOT   NULL   UNIQUE
)

    ● 现有表中创建UNIQUE约束:

ALTER   TABLE  Employees
   
ADD   CONSTRAINT  AK_EmployeeSSN   UNIQUE  (SSN)


9. CHECK约束
     CHECK约束最妙的地方是它们不局限于一个特定的列。它可以与一个列有关。可以基于同一个表中的另一个列来检查某个列。也可以检查列值的组合是否满足某个判断标准。
    例如,以下的例子是使用CHECK约束的时机:
限制MONTH列为适宜的值         BETWEEN 1 AND 12
正确的SSN格式                      LIKE ‘[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]’
限制在特定的shippers列表中     IN (‘UPS’, ‘Fed Ex’, ‘USPS’)
价格必须为正数                      UnitPrice >= 0
参考同一行中的另一个列           ShipDate >= OrderDate
      ● 在现有表中加入CHECK约束

ALTER   TABLE  Customers
    
ADD   CONSTRAINT  CN_CustomerDateInSystem  CHECK
           (DateInSystem 
<=   GETDATE  ())    -- 保证DateInSystem字段不大于当天日期。

 

10. DEFAULT约束
     DEFAULT用于处理“默认值”,如果插入的新行在定义默认值的约束上没有给出值,将以约束的定义来进行处理。可以将默认值定义为常量值(如0,’UNKOWN’),也可以是一些系统值(如GETDATE())
     ● 在创建表中加入DEFAULT约束

CREATE   TABLE  Shippers
(
    ShipperID 
int   IDENTITY   NOT   NULL
    
PRIMARY   KEY ,
    ShipperName 
varchar ( 30 NOT   NULL ,
    DateInSystem 
smalldatetime   NOT   NULL
    
DEFAULT   GETDATE  ()
)

     ● 在现有表中加入DEFAULT约束

ALTER   TABLE  Customers
     
ADD   CONSTRAINT  CN_CustomerAddress  DEFAULT  ‘UNKNOWN’  FOR  Address1


 

11. 禁用约束
     禁用不是删除约束,约束还是在表中存在的,只不过是对于值不进行约束检查,禁用可以是暂时的,也可以是永久的,视情况而定。
     另外,不能禁用PRIMARY KEY和UNIQUE约束
     ● 禁用约束的例子:
        首先,创建一个CHECK约束:

ALTER   TABLE  Customers
   
ADD   CONSTRAINT  CN_CustomerPhoneNo   CHECK
     (Phone 
LIKE  ‘( [ 0-9 ][ 0-9 ][ 0-9 ] [ 0-9 ][ 0-9 ][ 0-9 ] - [ 0-9 ][ 0-9 ][ 0-9 ][ 0-9 ] ’)

        然后,可以禁用该约束:

ALTER   TABLE  Customers
   
WITH   NOCHECK
   
ADD   CONSTRAINT  CN_CustomerPhoneNo   CHECK
      (Phone 
LIKE  ‘( [ 0-9 ][ 0-9 ][ 0-9 ] [ 0-9 ][ 0-9 ][ 0-9 ] - [ 0-9 ][ 0-9 ][ 0-9 ][ 0-9 ] ’)

        或者,更简单的方法:

ALTER   TABLE  Customers  NOCHECK    CONSTRAINT  CN_CustomerPhoneNo

        再恢复约束

ALTER   TABLE  Customers  CHECK   CONSTRAINT  CN_CustomerPhoneNo


 

12. 创建规则(rule)和默认值(default)
     规则不同于约束,约束是在表中定义的,而规则和默认值是独立定义的,定义完后,再“绑定”到表上。
     ● 规则:与CHECK约束相似。但不同的是规则局限在一次只能作于于一个列上,但可以把一个规则多次绑定到多个列上。
                 另外,规则只对每一个单独列起作用,不会意识到有其它列,所以定义(Column1>Column2)这样子的约束不能做为规则来实现。
     ● 定义规则和查看规则

CREATE   RULE  SalaryRule  AS   @Salary   >   0 ;
exec  sp_helptext SalaryRule;

     ● 绑定规则与反绑定
        语法定义 :sp_bindrule <’rule’>, <’object_name’>, [<’futureonly_flag’>]

EXEC  sp_bindrule ‘SalaryRule’, ‘Employees.Salary’  
EXEC  sp_unbindrule ‘Employees.Salary’

     ● 删除规则

DROP   RULE  ‘SalaryRule’


      ● 默认值:与DEFAULT约束相似,不同地方是:隶属于表的方式不同,并且,默认值支持用户定义数据类型

       ● 定义规则和查看默认值
CREATE   DEFAULT  SalaryDefault  AS   0
exec  sp_helptext SalaryDefault ;

      ● 绑定规则与反绑定
         语法定义 :sp_bindrule <’rule’>, <’object_name’>, [<’futureonly_flag’>]

EXEC  sp_bindefault ‘SalaryDefault’, ‘Employees.Salary’ 
EXEC  sp_unbindefault ‘Employees.Salary’

      ● 删除规则

DROP   DEFAULT  SalaryDefault

      ● 如果想要删除或修改规则或默认值,首先可能要知道谁在使用这些规则,SQL Server提供了一个系统存储过程来解决这一问题:

EXEC  sp_depends  < 对象名 >

         这样就可以在删除或更新前做到不会影响到其它表或数据.

相关文章:

  • 关于战略 - 杰克韦尔奇的5张PPT
  • Autodesk 2011系列新产品DevDay将于12月在北京/上海举行
  • Producer Consumer
  • DMZ基础及应用
  • Oracle编程高手箴言:位图索引(Bitmap Index)的故事
  • 一生有你做朋友
  • Linux+Svn+apache2安装与配置
  • sql 中要求现实数据保留两位小数
  • Forefront Security For Exchange的反病毒测试
  • Application Data转移,修改Application Data文件夹路径
  • SQL Server 2005利用分区对海量数据的处理
  • 今天1111
  • (新)网络工程师考点串讲与真题详解
  • 内存检测
  • 任务计划
  • hexo+github搭建个人博客
  • $translatePartialLoader加载失败及解决方式
  • Brief introduction of how to 'Call, Apply and Bind'
  • canvas 绘制双线技巧
  • DOM的那些事
  • Java,console输出实时的转向GUI textbox
  • js算法-归并排序(merge_sort)
  • k个最大的数及变种小结
  • Laravel Mix运行时关于es2015报错解决方案
  • Mybatis初体验
  • PAT A1092
  • Sass 快速入门教程
  • 回顾 Swift 多平台移植进度 #2
  • 机器学习学习笔记一
  • 用Visual Studio开发以太坊智能合约
  • ​水经微图Web1.5.0版即将上线
  • #QT(TCP网络编程-服务端)
  • $$$$GB2312-80区位编码表$$$$
  • $.each()与$(selector).each()
  • (52)只出现一次的数字III
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (力扣题库)跳跃游戏II(c++)
  • (篇九)MySQL常用内置函数
  • (四)汇编语言——简单程序
  • (一)Neo4j下载安装以及初次使用
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • ***利用Ms05002溢出找“肉鸡
  • .gitattributes 文件
  • .net 8 发布了,试下微软最近强推的MAUI
  • .net Stream篇(六)
  • [.NET]桃源网络硬盘 v7.4
  • [1181]linux两台服务器之间传输文件和文件夹
  • [14]内置对象
  • [2016.7 test.5] T1
  • [20171101]rman to destination.txt
  • [Android] Amazon 的 android 音视频开发文档
  • [Android]常见的数据传递方式