SQL 表
本文最后更新于:2024年3月18日 凌晨
SQL 表
基本表的定义与删除
定义基本表
1 |
|
- 建表的同时通常还可以定义与该表有关的完整性约束条件,这些完整性约束条件被存入系统的数据字典中,当用户操作表中数据时由关系数据库管理系统自动检查该操作是否违背这些完整性约束条件。如果完整性约束条件涉及该表的多个属性列,则必须定义在表级上,否则既可以定义在列级,也可以定义在表级。
AUTO_INCREMENT
:自增字段。COMMENT
:字段注释或表注释。DEFAULT
:字段默认值。DEFAULT CHARSET
:默认字符集。ENGINE
:存储引擎。
[例3.5]:建立一个"学生"表Student
1 |
|
- 系统执行该
CREATE TABLE
语句后,就在数据库中建立一个新的空"学生"表Student,并将有关"学生"表的定义及有关约束条件存放在数据字典中。
[例3.6]:建立一个"课程"表Course
1 |
|
本例说明参照表和参照表可以是同一个表。
[例3.7]:建立学生选课表SC
1 |
|
数据类型
数据类型 | 含义 |
---|---|
CHAR(n),CHARACYER(n) | 长度为n的定长字符串 |
VARCHAR(n),CHARACTERVARYING(n) | 最大长度为n的变长字符串 |
CLOB | 字符串大对象 |
BLOB | 二进制大对象 |
INT,INTEGER | 长整数(4字节) |
SMALLINT | 短整数(2字节) |
BIGINT | 大整数(8字节) |
NUMERIC(p,d) | 定点数,由p为数字(不包括符号,小数点)组成,小数点后面有d位数字 |
DECIMAL(p,d),DEC(p,d) | 同NUMERIC |
REAL | 取决于机器精度的单精度浮点数 |
DOUBLE PRECISION | 取决于机器精度的双精度浮点数 |
FLOAT(n) | 可选精度的浮点数,精度至少为n位数字 |
BOOLEAN | 逻辑布尔量 |
DATE | 日期,包括年,月,日,格式为yyyy-MM-dd |
TIME | 时间,包含一日的时,分,秒,格式为hh:mm:ss |
DATETIME | 日期和时间,包含年,月,日,时,分,秒,格式为yyyy-MM-dd hh:mm:ss |
TIMESTAMP | 时间戳类型 |
INTERVAL | 时间间隔类型 |
- 注意
- VARCHAR(255)以下使用额外一个字节保存长度。
- VARCHAR(255)以上使用额外两个字节保存长度。
- VARCHAR变更长度时会出现锁表。
- DATETIME与时区无关,精确到毫秒,TIMESTAMP与时区有关精确到秒。
模式与表
每一个基本表都属于某一个模式,一个模式包含多个基本表,当定义基本表时一般可以有三种方法定义它所属的模式:
-
在表名中明显地给出模式名。
1
2
3CREATE TABLE "S-T".Student(...);/*Student所属的模式是"S-T"*/
CREATE TABLE "S-T".SC(...);/*SC所属的模式是"S-T"*/
CREATE TABLE "S-T".Course(...);/*Course所属的模式是"S-T"*/ -
在创建模式语句中同时创建表。
-
设置所属的模式,这样在创建表时表名中不必给出模式名。
-
当用户创建基本表(其他数据库对象也一样)时若没有指定模式,系统根据搜索路径(search path)来确定该对象所属的模式,搜索路径包含一组模式列表,关系数据库管理系统会使用模式列表中第一个存在的模式作为数据库对象的模式名,若搜索路径中的模式名都不存在,系统将给出错误。
-
使用下面的语句可以显示当前的搜索路径:
1 |
|
- 搜索路径的当前默认值是$user,PUBLIC.其含义是首先搜索与用户名相同的模式名,如果该模式名不存在,则使用PUBLIC模式。
- 数据库管理员也可以设置搜索路径,例如:
1 |
|
- 然后定义基本表:
1 |
|
- 实际结果是建立了S-T.Student基本表。因为关系数据库管理系统发现搜索路径中第一个模式名S-T存在,就把该模式作为基本表Student所属的模式。
清除基本表数据
TRUNCATE 命令用于删除现有数据表中的所有数据。
1 |
|
实例
- 考虑 CUSTOMERS 表,表中的记录如下所示:
1 |
|
- 下面的示例展示了 TRUNCATE 命令的用法:
1 |
|
- 现在,CUSTOMERS 表已经被清空了,SELECT 语句的输出应当如下所示:
1 |
|
删除基本表
1 |
|
注意
- 若选择RESTRICT,则该表的删除是有限制条件的。欲删除的基本表不能被其他表的约束所引用(如CHECK,FOREIGN KEY等约束),不能有视图,不能有触发器(trigger),不能有存储过程或函数等,如果存在这些依赖该表的对象,则此表不能被删除。
- 若选择CASCADE,则该表的删除没有限制条件,在删除基本表的同时,相关的依赖对象,例如视图,都将一起删除。
- 默认情况是RESTRICT
[例3.11]:删除Student表。
1 |
|
基本表定义一旦被删除,不仅表中的数据和此表的定义将被删除,而且此表上建立的索引,触发器等对象一般也都将被删除,有的关系数据库管理系统还会同时删除在此表上的索引,触发器等对象一般也都将被删除,有的关系数据库管理系统还会同时删除在此表上建立的视图,如果欲删除的基本表被其他基本表所引用,则这些表也可能被删除,SC也被级联删除,因此执行删除基本表的操作一定要格外小心。
[例3.12]:若表上建有视图,选择RESTRICT时表不能删除,选择CASCADE时可以删除表,视图也自动被删除。
1 |
|
注意:不同的数据库产品在遵循SQL标准的基础上具体实现细节和处理策略会与标准有差别。
修改基本表
1 |
|
<表名>
是要修改的就基本表。ADD
子句用于增加新列,新的列级完整性约束条件和新的表级完整性约束条件。DROP COLUMN
子句用于删除表中的列如果指定了CASCADE
短语,则自动删除引用了该列的其他对象,比如视图;如果指定了RESTRICT
短语,则如果该列被其他对象引用,RDBMS将拒绝删除该列。DROP CONSTRAINT
子句用于删除指定的完整性约束条件。ALTER COLUMN
子句用于修改原有的列定义,包括修改列名和数据类型。
添加字段
- 向Student表增加"入学时间"列,其数据类型为日期型。
1 |
|
- 不论基本表中原来是否已有数据,新增加的列一律为空值。
删除字段
1 |
|
修改字段数据类型
将年龄的数据类型由字符型(假设原来的数据类型是字符型)改为整数。
1 |
|
添加字段约束
- 增加课程名称必须取唯一值的约束条件。
1 |
|
删除字段约束
1 |
|
修改表名
1 |
|
修改字段
1 |
|
修改自增起始值
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!