【基本表定义】
基本语法
创建了一个模式,就创建了一个数据库的命名空间,在这个命名空间中,首先要做的就是创建该模式所包含的数据库基本表
在 SQL 中,创建基本表的语法如下:
1 | CREATE TABLE <表名> (<列名1> <数据类型1> [列级完整性约束条件1] |
建表的同时可以定义与该表有关的完整性约束条件,这些完整性约束条件会被存入系统的数据字典中,当用户操作表中数据时,RDBMS 会自动检查该操作是否违背完整性约束条件
需要注意的是,如果完整性约束条件涉及到该表的多个属性列,则必须定义在表级上,否则,既可以定义在列级也可以定义在表级
数据类型
在关系模型中,每一个属性来自一个域,其取值必须是域中的值
而在 SQL 中,域的概念用数据类型来实现,因此在定义表的各属性时,要指明数据类型及长度,一个属性选用何种数据类型要根据实际情况来决定,一般从取值范围、要做的运算两个方向来进行考虑
基本的数据类型如下表,要注意的是,不同的 RDBMS 中,支持的数据类型不完全相同
实例
建立学生表 student,表中包含学号 Sno、姓名 Sname、性别 Ssex、年龄 Sage、专业 Sdept 五个属性,要求 Sno 是主码(列级完整性约束条件为 PRIMARY KEY
),Sname 取值唯一(列级完整性约束条件为 UNIQUE
)
1 | CREATE TABLE student ( |
建立课程表 course,表中包含课程号 Cno、课程名 Cname、先修课号 Cpno、学分 Ccredit 四个属性,要求 Cno 是主码(列级完整性约束条件为 PRIMARY KEY
),Cname 不能为空(列级完整性约束条件为 NOT NULL
),同时要求将 Cpno 设为外码,被参照表是 Course 表,被参照列是 Cno(表级完整性约束条件为 FOREING KEY(外码) REFERENCES 被参照表(被参照列)
)
1 | CREATE TABLE course ( |
建立学生选课表 sc,表中包含学生学号 Sno、课程号 Cno、成绩 SMALLINT,要求 Sno 与 Cno 共同作为主码,同时将 Sno、Cno 设为外码,被参照表分别为 Student 和 Course
1 | CREATE TABLE sc ( |
模式与表
每一个基本表都属于某一个模式,一个模式中包含多个基本表,在定义基本表时,有以下三种方法来定义其所属的模式
- 在创建模式时同时创建表名:
CREATE SCHEMA <模式名> AUTHORIZATION <用户名> <表定义子句>;
- 在表名中显示给出模式名:
CREATE TABLE <模式名>.<表名>(...);
- 设置所属模式,在创建表时不必给出模式名
对于第一种方法,在 SQL 模式的定义与删除 中,介绍了模型定义的子句支持,可以在定义模式的同时创建基本表
对于第二种方法,其具体使用详见如下实例
1 | CREATE TABLE S-T.Student(...); /*Student所属的模式是S-T*/ |
对于第三种方法,系统根据搜索路径来确定该对象所属的模式,RDBMS 会使用模式列表中第一个存在的模式作为数据库对象的模式名,如果搜索路径中的模式名都不存在,系统会报异常错误
使用 SHOW search_path;
语句可以显示当前的搜索路径,其默认值是 $user, PUBLIC
,含义是先搜索与用户名相同的模式名,如果该模式名不存在,则使用 PUBLIC
模式
数据库管理员可以使用 SET search_path TO <路径>, PUBLIC
命令来设置搜索路径
【基本表修改】
在 SQL 中,修改基本表的语法如下
1 | ALTER TABLE <表名> |
其中,<表名>
是要修改的基本表,ADD
子句用于增加新列、新的列级完整性约束条件、新的表级完整性约束条件,DROP
子句用于删除表中的列,DROP CONSTRAINT
子句用于删除指定的完整性约束条件,ALTER COLUMN
用于修改原有的列定义(列名与数据类型)
在 DROP
子句和 DROP CONSTRAINT
子句中,如果指定了级联短语 CASCADE
,则自动删除引用了该列的其他对象;如果指定了约束短语 RESTRICT
,则若该列被其他对象引用,RDBMS 将拒绝删除该列
例如,向学生表 student 中增加入学时间 S_entrance 列,其数据类型为日期型
1 | ALTER TABLE stuendt ADD S_entrance DATA; |
此时,无论基本表中原来是否有数据,新增加的列一律为空值
【基本表删除】
在 SQL 中,删除基本表的语法如下
1 | DROP TABLE <表名> [CASCADE|RESTRICT]; |
如果指定了级联短语 CASCADE
,则删除该表时,会将相关的依赖对象一起删除
例如,student 表上建有视图 IS_Student,删除该表时,指定级联短语 CASCADE
此时,基本表定义与数据会被删除,同时表上建立的视图也会被删除
1 | DROP TABLE student CASCADE; |
如果指定了约束短语 RESTRICT
,则被删除的表不能被其他表的约束所引用,同时如果存在依赖该表的对象,RDBMS 也将拒绝删除该表,同时报出错误
例如,删除 student 表,指定级联短语 RESTRICT
此时,系统将返回错误信息,存在依赖该表的对象,此表不能被删除
1 | DROP TABLE student RESTRICT; |