Alex_McAvoy

想要成为渔夫的猎手

SQL 基本表的数据定义

【基本表定义】

基本语法

创建了一个模式,就创建了一个数据库的命名空间,在这个命名空间中,首先要做的就是创建该模式所包含的数据库基本表

在 SQL 中,创建基本表的语法如下:

1
2
3
4
5
CREATE TABLE <表名> (<列名1> <数据类型1> [列级完整性约束条件1]
[,<列名2> <数据类型2> [列级完整性约束条件2]]
...
[,<列名n> <数据类型n> [列级完整性约束条件n]]
[,<表级完整性约束条件>]);

建表的同时可以定义与该表有关的完整性约束条件,这些完整性约束条件会被存入系统的数据字典中,当用户操作表中数据时,RDBMS 会自动检查该操作是否违背完整性约束条件

需要注意的是,如果完整性约束条件涉及到该表的多个属性列,则必须定义在表级上,否则,既可以定义在列级也可以定义在表级

数据类型

关系模型中,每一个属性来自一个域,其取值必须是域中的值

而在 SQL 中,域的概念用数据类型来实现,因此在定义表的各属性时,要指明数据类型及长度,一个属性选用何种数据类型要根据实际情况来决定,一般从取值范围要做的运算两个方向来进行考虑

基本的数据类型如下表,要注意的是,不同的 RDBMS 中,支持的数据类型不完全相同

实例

建立学生表 student,表中包含学号 Sno、姓名 Sname、性别 Ssex、年龄 Sage、专业 Sdept 五个属性,要求 Sno 是主码(列级完整性约束条件为 PRIMARY KEY),Sname 取值唯一(列级完整性约束条件为 UNIQUE

1
2
3
4
5
6
7
CREATE TABLE student (
Sno CHAR(9) PRIMARY KEY, /*列级完整性约束条件,主码*/
Sname CHAR(20) UNIQUE, /*列级完整性约束条件,取唯一值*/
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20)
);

建立课程表 course,表中包含课程号 Cno、课程名 Cname、先修课号 Cpno、学分 Ccredit 四个属性,要求 Cno 是主码(列级完整性约束条件为 PRIMARY KEY),Cname 不能为空(列级完整性约束条件为 NOT NULL),同时要求将 Cpno 设为外码,被参照表是 Course 表,被参照列是 Cno(表级完整性约束条件为 FOREING KEY(外码) REFERENCES 被参照表(被参照列)

1
2
3
4
5
6
7
CREATE TABLE course (
Cno CHAR(4) PRIMARY KEY, /*列级完整性约束条件,主码*/
Cname CHAR(40) NOT NULL, /*列级完整性约束条件,非空*/
Cpno CHAR(4),
Ccredit SMALLINT,
FOREIGN KEY(Cpno) REFERENCES Course(Cno) /*表级完整性约束条件*/
);

建立学生选课表 sc,表中包含学生学号 Sno、课程号 Cno、成绩 SMALLINT,要求 Sno 与 Cno 共同作为主码,同时将 Sno、Cno 设为外码,被参照表分别为 Student 和 Course

1
2
3
4
5
6
7
8
CREATE TABLE sc (
Sno CHAR(9),
Cno CHAR(4),
Grade SMALLINT,
PRIMARY KEY(Sno, Cno), /*表级完整性约束条件*/
FOREIGN KEY(Sno) REFERENCES Student(Sno), /*表级完整性约束条件*/
FOREIGN KEY(Cno) REFERENCES Course(Cno) /*表级完整性约束条件*/
);

模式与表

每一个基本表都属于某一个模式,一个模式中包含多个基本表,在定义基本表时,有以下三种方法来定义其所属的模式

  1. 在创建模式时同时创建表名:CREATE SCHEMA <模式名> AUTHORIZATION <用户名> <表定义子句>;
  2. 在表名中显示给出模式名:CREATE TABLE <模式名>.<表名>(...);
  3. 设置所属模式,在创建表时不必给出模式名

对于第一种方法,在 SQL 模式的定义与删除 中,介绍了模型定义的子句支持,可以在定义模式的同时创建基本表

对于第二种方法,其具体使用详见如下实例

1
CREATE TABLE S-T.Student(...);  /*Student所属的模式是S-T*/

对于第三种方法,系统根据搜索路径来确定该对象所属的模式,RDBMS 会使用模式列表中第一个存在的模式作为数据库对象的模式名,如果搜索路径中的模式名都不存在,系统会报异常错误

使用 SHOW search_path; 语句可以显示当前的搜索路径,其默认值是 $user, PUBLIC,含义是先搜索与用户名相同的模式名,如果该模式名不存在,则使用 PUBLIC 模式

数据库管理员可以使用 SET search_path TO <路径>, PUBLIC 命令来设置搜索路径

【基本表修改】

在 SQL 中,修改基本表的语法如下

1
2
3
4
5
6
ALTER TABLE <表名>
[ADD [COLUMN] <新列名> <数据类型> [完整性约束]]
[ADD <表级完整性约束>]
[DROP [COLUMN] <列名> [CASCADE|RESTRICT]]
[DROP CONSTRAINT <完整性约束名> [CASCADE|RESTRICT]]
[ALTER COLUMN <列名> <数据类型>];

其中,<表名> 是要修改的基本表,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
2
DROP TABLE student CASCADE;
--NOTICE: drop cascades to view IS_Student

如果指定了约束短语 RESTRICT,则被删除的表不能被其他表的约束所引用,同时如果存在依赖该表的对象,RDBMS 也将拒绝删除该表,同时报出错误

例如,删除 student 表,指定级联短语 RESTRICT

此时,系统将返回错误信息,存在依赖该表的对象,此表不能被删除

1
2
DROP TABLE student RESTRICT;
--ERROR: cannot drop table Student because other object depend on it
感谢您对我的支持,让我继续努力分享有用的技术与知识点!