Sql server表操作基础

1、创建表

1.1概述

表可以通过以下两种方法创建:企业管理器;DDL建表。

建表时应该考虑的问题:

  • 表名
  • 列的特征(列数,每列的列名、类型、宽度及是否允许为空等)
  • 主键、索引、约束等

权限。CREATE TABLE 权限默认授予 db_owner 和 db_ddladmin 固定数据库角色成员。db_owner 固定数据库角色成员和 sysadmin 固定服务器角色成员可以将 CREATE TABLE 权限转让给其他用户。

1.2完整语法

CREATE TABLE
[ database_name.[ owner ] . | owner. ] table_name
( { < column_definition >
| column_name AS computed_column_expression
| < table_constraint > } [ ,...n ]
)

[ ON { filegroup | DEFAULT } ]
[ TEXTIMAGE_ON { filegroup | DEFAULT } ]

< column_definition > ::= column_name data_type
[ COLLATE < collation_name > ]
[ [ DEFAULT constant_expression ]
| [ IDENTITY [ ( seed , increment ) [ NOT FOR REPLICATION ] ] ]
]
[ ROWGUIDCOL]
[ < column_constraint > ] [ ...n ]

< column_constraint > ::= [ CONSTRAINT constraint_name ]
{ [ NULL | NOT NULL ]
| [ { PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
[ WITH FILLFACTOR = fillfactor ]
[ON {filegroup | DEFAULT} ] ]
]
| [ [ FOREIGN KEY ]
REFERENCES ref_table [ ( ref_column ) ]
[ ON DELETE { CASCADE | NO ACTION } ]
[ ON UPDATE { CASCADE | NO ACTION } ]
[ NOT FOR REPLICATION ]
]
| CHECK [ NOT FOR REPLICATION ]
( logical_expression )
}

< table_constraint > ::= [ CONSTRAINT constraint_name ]
{ [ { PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
{ ( column [ ASC | DESC ] [ ,...n ] ) }
[ WITH FILLFACTOR = fillfactor ]
[ ON { filegroup | DEFAULT } ]
]
| FOREIGN KEY
[ ( column [ ,...n ] ) ]
REFERENCES ref_table [ ( ref_column [ ,...n ] ) ]
[ ON DELETE { CASCADE | NO ACTION } ]
[ ON UPDATE { CASCADE | NO ACTION } ]
[ NOT FOR REPLICATION ]
| CHECK [ NOT FOR REPLICATION ]
( search_conditions )
}

1.3部分语法

CREATE TABLE table_name
( column_name datatype [table_constraint] [,...n] )

1.3.1说明
  • 本地临时表表名前加#,全局临时表表名前加##
  • PRIMARY KEY约束
    • 一个表只能包含一个 PRIMARY KEY 约束
    • 存在PRIMARY KEY 约束的表中的非聚集索引不能超过 249 个,聚集索引不能超过 1 个
    • 在主键约束上自动创建CLUSTERED索引
    • 在 PRIMARY KEY 约束中定义的所有列都必须定义为 NOT NULL
  • UNIQUE约束
    • 如果 UNIQUE 约束中没有指定 CLUSTERED 或 NONCLUSTERED,则默认为 NONCLUSTERED
    • 每个 UNIQUE 约束都生成一个索引,表中的非聚集索引不能超过 249 个,聚集索引不能超过 1 个
    • 允许出现NULL值,但只能有一个,其它特性与主键约束相同(值的唯一性)
  • FOREIGN KEY 约束
    • 如果在 FOREIGN KEY 约束的列中输入非 NULL 值,则此值必须在被引用的列中存在,否则将返回违反外键约束的错误信息
    • FOREIGN KEY 约束仅能引用位于同一服务器上的同一数据库中的表。数据库间的引用完整性必须通过触发器实现
    • FOREIGN KEY 可以引用同一表中的其它列(自引用)
    • 一个表最多可包含 253 个 FOREIGN KEY 约束
    • 对于临时表不强制 FOREIGN KEY 约束
    • 每个表在其 FOREIGN KEY 约束中最多可以引用 253 个不同的表
    • FOREIGN KEY 约束只能引用被引用表的 PRIMARY KEY 或 UNIQUE 约束中的列或被引用表上 UNIQUE INDEX 中的列
  • DEFAULT 定义
    • 每列只能有一个 DEFAULT 定义
    • DEFAULT 定义可以包含常量值、函数、SQL-92 niladic 函数(提供当前系统日期时间或当前插入操作的用户名等)或 NULL
    • DEFAULT 定义中的 constant_expression 不能引用表中的其它列,也不能引用其它表、视图或存储过程
    • 不能在数据类型为 timestamp 的列或具有 IDENTITY 属性的列上创建 DEFAULT 定义
  • CHECK 约束
    • 列可以有任意多个 CHECK 约束,并且约束条件中可以包含用 AND 和 OR 组合起来的多个逻辑表达式。列上的多个 CHECK 约束按创建顺序进行验证
    • 搜索条件必须取值为布尔表达式,并且不能引用其它表
  • 其它约束信息
    • 为约束创建的索引不能用 DROP INDEX 语句除去;必须用 ALTER TABLE 语句除去约束
    • 约束的名称必须符合标识符规则,但其名称的首字符不能为 #。如果没有提供 constraint_name,则使用系统生成的名称。约束名将出现在所有与违反约束有关的错误信息中
    • 当 INSERT、UPDATE 或 DELETE 语句违反约束时,将终止执行该语句。但将继续处理事务(如果此语句为显式事务的组成部分)。可以通过检查系统函数 @@ERROR,在事务定义中使用 ROLLBACK TRANSACTION 语句
1.3.2分项示例

例1:使用 PRIMARY KEY 约束

* job_id smallint PRIMARY KEY CLUSTERED

* emp_id empid CONSTRAINT PK_emp_id PRIMARY KEY NONCLUSTERED

例2:使用 FOREIGN KEY 约束

* job_id smallint NOT NULL DEFAULT 1 REFERENCES jobs(job_id)

* 也可以显式使用 FOREIGN KEY 子句并复述列特性。注意在这两个表中列名不必相同。 FOREIGN KEY (job_id) REFERENCES jobs(job_id)

* 下例显示如何从其它表中引用多列键。CONSTRAINT FK_sales_backorder FOREIGN KEY (stor_id, ord_num, title_id) REFERENCES sales (stor_id, ord_num, title_id)

例3:使用 UNIQUE 约束(UNIQUE 约束用于强制非主键列的唯一性)

* pseudonym varchar(30) NULL UNIQUE NONCLUSTERED

* stores 表中,stor_name 列和 city 列上创建的 UNIQUE 约束,实现同一个城市中的商店不应同名约束。CONSTRAINT U_store UNIQUE NONCLUSTERED (stor_name, city)

例4:使用 DEFAULT 定义(使用 INSERT 和 UPDATE 语句时,如果没有提供值,则默认会提供值。)

* job_descvarchar(50) NULL DEFAULT 'New Position - title not formalized yet'

* 获取输入项的当前日期: DEFAULT (getdate())

例5:使用 CHECK 约束

* min_lvl tinyint NOT NULL CHECK (min_lvl >= 10)

* emp_id char(9) CONSTRAINT PK_emp_id PRIMARY KEY NONCLUSTERED CONSTRAINT CK_emp_id CHECK (emp_id LIKE '[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]' or emp_id LIKE '[A-Z]-[A-Z][1-9][0-9][0-9][0-9][0-9][FM]')

* CHECK (pub_id IN ('1389', '0736', '0877', '1622', '1756') OR pub_id LIKE '99[0-9][0-9]')

1.4例

1.4.1完整表定义

/* ************************** jobs table ************************** */
CREATE TABLE jobs
(
job_id smallint IDENTITY(1,1) PRIMARY KEY CLUSTERED,
job_desc varchar(50) NOT NULL DEFAULT 'New Position - title not formalized yet',
min_lvl tinyint NOT NULL CHECK (min_lvl >= 10),
max_lvl tinyint NOT NULL CHECK (max_lvl <= 250)
)

/* ************************* employee table ************************* */
CREATE TABLE employee
(
emp_id empid CONSTRAINT PK_emp_id PRIMARY KEY NONCLUSTERED CONSTRAINT CK_emp_id CHECK (emp_id LIKE '[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]' or emp_id LIKE '[A-Z]-[A-Z][1-9][0-9][0-9][0-9][0-9][FM]'),
fname varchar(20) NOT NULL,
minit char(1) NULL,
lname varchar(30) NOT NULL,
job_id smallint NOT NULL DEFAULT 1 REFERENCES jobs(job_id),
job_lvl tinyint DEFAULT 10,
pub_id char(4) NOT NULL DEFAULT ('9952') REFERENCES publishers(pub_id),
hire_date datetime NOT NULL DEFAULT (getdate())
)

/* ***************** publishers table ******************** */
CREATE TABLE publishers
(
pub_id char(4) NOT NULL CONSTRAINT UPKCL_pubind PRIMARY KEY CLUSTERED CHECK (pub_id IN ('1389', '0736', '0877', '1622', '1756') OR pub_id LIKE '99[0-9][0-9]'),
pub_name varchar(40) NULL,
city varchar(20) NULL,
state char(2) NULL,
country varchar(30) NULL DEFAULT('USA')
)

2、修改表

2.1概述

实现表定义的更改。

权限。ALTER TABLE 权限默认授予表的所有者、sysadmin 固定服务器角色成员、db_owner 和 db_ddladmin 固定数据库角色成员且不可转让。

2.2完整语法

ALTER TABLE table
{ [ ALTER COLUMN column_name
{ new_data_type [ ( precision [ , scale ] ) ]
[ COLLATE < collation_name > ]
[ NULL | NOT NULL ]
| {ADD | DROP } ROWGUIDCOL }
]
| ADD
{ [ < column_definition > ]
| column_name AS computed_column_expression
} [ ,...n ]
| [ WITH CHECK | WITH NOCHECK ] ADD
{ < table_constraint > } [ ,...n ]
| DROP
{ [ CONSTRAINT ] constraint_name
| COLUMN column } [ ,...n ]
| { [ WITH CHECK | WITH NOCHECK ] CHECK | NOCHECK } CONSTRAINT
{ ALL | constraint_name [ ,...n ] }
| { ENABLE | DISABLE } TRIGGER
{ ALL | trigger_name [ ,...n ] }
}

< column_definition > ::=
{ column_name data_type }
[ [ DEFAULT constant_expression ] [ WITH VALUES ]
| [ IDENTITY [ (seed , increment ) [ NOT FOR REPLICATION ] ] ]
]
[ ROWGUIDCOL ]
[ COLLATE < collation_name > ]
[ < column_constraint > ] [ ...n ]

< column_constraint > ::=
[ CONSTRAINT constraint_name ]
{ [ NULL | NOT NULL ]
| [ { PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
[ WITH FILLFACTOR = fillfactor ]
[ ON { filegroup | DEFAULT } ]
]
| [ [ FOREIGN KEY ]
REFERENCES ref_table [ ( ref_column ) ]
[ ON DELETE { CASCADE | NO ACTION } ]
[ ON UPDATE { CASCADE | NO ACTION } ]
[ NOT FOR REPLICATION ]
]
| CHECK [ NOT FOR REPLICATION ]
( logical_expression )
}

< table_constraint > ::=
[ CONSTRAINT constraint_name ]
{ [ { PRIMARY KEY | UNIQUE }
[ CLUSTERED | NONCLUSTERED ]
{ ( column [ ,...n ] ) }
[ WITH FILLFACTOR = fillfactor ]
[ ON {filegroup | DEFAULT } ]
]
| FOREIGN KEY
[ ( column [ ,...n ] ) ]
REFERENCES ref_table [ ( ref_column [ ,...n ] ) ]
[ ON DELETE { CASCADE | NO ACTION } ]
[ ON UPDATE { CASCADE | NO ACTION } ]
[ NOT FOR REPLICATION ]
| DEFAULT constant_expression
[ FOR column ] [ WITH VALUES ]
| CHECK [ NOT FOR REPLICATION ]
( search_conditions )
}

2.3部分语法

2.3.1添加列

ADD TABLE table_name ADD column_name列定义 [,...n]

例:更改表以添加新列

if exists (select * from tempdb.dbo.sysobjects where name like '#doc_exa%')
drop table [dbo].[#doc_exa]

CREATE TABLE #doc_exa ( column_a INT)
GO
ALTER TABLE #doc_exa ADD column_b VARCHAR(20) NULL
GO
SELECT * FROM #doc_exa
GO

2.3.2撤消列

ALTER TABLE table_name DROP COLUMN column_name

例:更改表以除去列

if exists (select * from tempdb.dbo.sysobjects where name like '#doc_exb%')
drop table [dbo].[#doc_exb]

CREATE TABLE #doc_exb ( column_a INT, column_b VARCHAR(20) NULL)
GO
ALTER TABLE #doc_exb DROP COLUMN column_b
GO
SELECT * FROM #doc_exb

2.3.3修改列

ALTER TABLE table_name ALTER COLUMN column_name data_type [NULL | NOT NULL]

例:更改表中的列

if exists (select * from tempdb.dbo.sysobjects where name like '#doc_exc%')
drop table [dbo].[#doc_exc]

CREATE TABLE #doc_exc ( column_a INT, column_b VARCHAR(20) NULL)
GO
ALTER TABLE #doc_exc ALTER COLUMN column_b CHAR(10) NOT NULL
GO
SELECT * FROM #doc_exc

3、删除表

3.1概述

将删除表定义和所有数据,以及该表的权限指定。

默认情况下,将 DROP TABLE 权限授予表所有者,该权限不可转让。然而,sysadmin 固定服务器角色成员或 db_owner 和 db_ddladmin 固定数据库角色成员可以通过在 DROP TABLE 内指定所有者除去任何对象。

3.2语法

DROP TABLE table_name

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值