零基础学SQL
上QQ阅读APP看书,第一时间看更新

4.5 修改数据库中的表

如果在创建完数据表之后,还需要对数据表结构做一些修改,例如向数据表中增加某一列、删除某一列、为数据表中的某一列增加约束条件或者索引、修改数据表中某一列的数据类型等,这个时候就需要使用ALTER TABLE语句。这一节就来介绍如何使用ALTER TABLE语句修改数据表结构。

4.5.1 向表中增加一列

在实际应用中,根据实际需要,有些时候需要为数据表增加一个指定的列,用来完善数据表信息。向数据表增加一列的语法格式如下:

        ALTER TABLE table_name ADD(column_name datatype [constraint_condition])

其中,ALTER TABLE是修改表结构的关键字;关键字ALTER TABLE之后跟的table_name是表的名字;ADD是关键字,用来指定数据表中要增加的列;关键字ADD后面的括号中需要指定新增加的列名、该列对应的数据类型和完整性约束条件。column_name表示新增加的列名,datatype用来指定该列的数据类型,constraint_condition用来表示该列的完整性约束条件,它是可选的。

例4.10 向教师信息表中增加一个表示教师工资的列。

        ALTER TABLE T_teacher ADD salary INT NOT NULL

这段SQL是为教师信息表增加一个表示教师工资的列。其中,T_teacher表示教师信息表的名字;salary表示教师信息表中新增加的列;INT指定该列的数据类型;NOT NULL指定列salary的完整性约束条件,这里为列salary定义一个非空约束。

选中MySQL 5.0用户图形界面的右侧Schemata选项下的test_STInfo数据库中的教师信息表T_teacher,单击鼠标右键,在出现的列表中选择“Edit Tabel”选项,在出现的表编辑对话框中,从“Columns and Indices”选项卡下的表格中可以看到,在该表格的最后多出了一个salary列,如图4.9所示。

图4.9 向数据表中增加一列

4.5.2 增加一个约束条件

如果在创建一个数据表时没有为指定的列定义约束条件,在数据表创建完成后,可以使用ALTER TABLE语句中的ADD子句为某一列增加一个约束条件。语法格式如下:

        ALTER TABLE table_name ADD constraint_type (column_name)

其中,ALTER TABLE是修改表结构的关键字;关键字ALTER TABLE之后跟的table_name是表的名字;ADD是关键字,用来指定数据表中要增加的列;关键字ADD后面的括号中需要指定约束条件和新增加的列名。constraint_type表示指定的约束条件,column_name表示新增加的列名。

使用ALTER TABLE语句可以为数据表增加UNIQUE约束、PRIMARY KEY约束、CHECK约束。例如下面这个例子。

例4.11 为院系信息表增加主键约束。

        ALTER TABLE T_dept ADD PRIMARY KEY(deptID)

这段SQL是为院系信息表中的列deptID增加主键约束。其中,T_dept表示院系信息表的名字;PRIMARY KEY表示要为T_dept表中的列增加主键约束,关键字PRIMARY KEY后的括号中指定了列的名字。列deptID表示院系编号。

读者可以选中MySQL 5.0用户图形界面的右侧Schemata选项下的test_STInfo数据库中的院系信息表T_dept,单击鼠标右键,在出现的列表中选择“Edit Tabel”选项,看一下院系信息表中表结构是否发生了变化。

在SQL语句中,除了可以为数据表增加UNIQUE约束、PRIMARY KEY约束和CHECK约束之外,也可以为数据表增加FOREIGN KEY约束。为数据表中的某一列增加FOREIGN KEY约束的方法与上面的方法有些不同。

增加FOREIGN KEY约束需要在ALTER TABLE语句的ADD子句之后增加一个REFERENCES关键字,用来指明与之关联的主表的表名和相应的列。增加FOREIGN KEY约束的语法格式如下:

        ALTER TABLE table_name1 ADD FOREIGN KEY (column_name1)
        REFERENCES table_name2(column_name2)

其中,table_name1表示从表的名字;FOREIGN KEY是定义外键的关键字;column_name1表示列名,用来指定数据表中用于外键约束条件的外键;REFERENCES关键字用来指定主表中的表名和主表中的关键列;table_name2表示主表的名字;column_name2表示与从表列column_name1对应的主键列的名字。

例4.12 为成绩信息表增加外键约束。

        ALTER TABLE T_result ADD   FOREIGN KEY(curID)
        REFERENCES T_curriculum(curID)

这段SQL语句是为成绩信息表中的列curID增加外键约束。其中,FOREIGN KEY表示创建外键约束的关键字;curID表示为成绩信息表(T_result)中的表示课程编号的列curID定义外键约束;REFERENCES T_curriculum(curID)表示将列curID定义为一个指向课程信息表T_curriculum的主键curID中的外键。

选中MySQL 5.0用户图形界面的右侧Schemata选项下的test_STInfo数据库中的成绩信息表T_result,单击鼠标右键,在出现的列表中选择“Edit Tabel”选项,在出现的表编辑对话框中,选择对话框下方的“Foreign Keys”选项卡,可以看到为成绩信息表T_result中列curID定义的外键约束信息,如图4.10所示。

图4.10 成绩信息表外键约束信息

在图4.10中,“Foreign Key Settings”选项下描述了对数据表T_result中列curID定义的外键约束信息。其中,“Key Name”表示主键的名字;“Ref.Table”指定了表T_result对应的主表,这里表T_result对应的主表为T_ curriculum(课程信息表);On Delete指定了数据删除方式,这里的删除方式指定为Restrict(受限删除);On Update指定了数据修改方式,这里的修改方式指定为Restrict(受限修改)。

4.5.3 增加一个索引

如果在创建一个数据表时没有为指定的列定义索引,在数据表创建完成后,可以使用ALTER TABLE语句中的ADD子句为列增加一个索引。其语法格式如下:

        ALTER TABLE table_name ADD INDEX(column_name1[, column_name2]...)

其中,ALTER TABLE是修改表结构的关键字;关键字ALTER TABLE之后跟的table_name是表的名字;ADD是关键字,用来指定数据表中要增加的列;INDEX关键字表示要为数据表增加一个索引。column_name1表示为增加索引指定的列。指定列可以是一列,也可以是多列。

例4.13 为课程信息表中的列增加索引。

        ALTER TABLE T_curriculum ADD INDEX i_credit(credit)

这段SQL语句是为课程信息表中的列credit增加索引。其中,T_curriculum表示课程信息表的名字;i_credit表示要增加的索引的名字;credit表示增加索引指定的列。这里列credit表示课程的学分。

选中MySQL 5.0用户图形界面的右侧Schemata选项下test_STInfo数据库中的课程信息表T_curriculum,单击鼠标右键,在出现的列表中选择“Edit Tabel”选项,在出现的表编辑对话框中,选择对话框下方的“Indices”选项卡,可以看到为课程信息表T_curriculum中列credit增加的索引信息,如图4.11所示。

图4.11 为课程信息表增加索引信息

4.5.4 修改表中的某一列

在实际应用中,有些时候需要对数据表中的某一列的数据类型、默认值等内容进行修改,这时就需要使用ALTER TABLE中的MODIFY子句。其语法格式如下:

        ALTER TABLE table_name MODIFY column_name datatype

其中,ALTER TABLE是修改表结构的关键字;关键字ALTER TABLE之后跟的table_name是表的名字;MODIFY是关键字,用来表示要对数据表中的某一列进行修改操作;关键字MODIFY后面需要指定要修改列的名字和该列对应的数据类型;column_name表示列的名字;datatype表示列的数据类型。

例4.14 修改学生信息表中表示学生年龄列的数据类型。

        ALTER TABLE T_student MODIFY sex CHAR(2)

这段SQL语句是将学生信息表中表示学生性别的列的数据类型修改为CHAR类型。其中,T_student表示学生信息表的名字;MODIFY关键字表示要对指定列进行修改;sex是指学生信息表中表示学生性别的列;CHAR(2)表示列sex的数据类型。

选中MySQL 5.0用户图形界面的右侧Schemata选项下test_STInfo数据库中的学生信息表T_student,单击鼠标右键,在出现的列表中选择“Edit Tabel”选项,在出现的表编辑对话框中,从“Columns and Indices”选项卡下的表格中可以看到,列sex对应的数据类型已经由原来的VARCHAR类型变成了现在的CHAR类型,如图4.12所示。

图4.12 修改学生信息表中表示学生年龄列的数据类型

4.5.5 删除表中某一列

如果在数据表中的某一列不需要使用了,可以使用ALTER TABLE语句中的DROP子句将该列删除。其删除的语法格式如下:

        ALTER TABLE table_name DROP column_name

其中,ALTER TABLE是修改表结构的关键字;关键字ALTER TABLE之后跟的table_name是表的名字;DROP是关键字,用来表示要对数据表中的某一列进行删除操作;关键字DROP后面需要指定要删除列的名字。

例4.15 删除教师信息表中表示院系编号的列。

        ALTER TABLE T_teacher   DROP deptID

这段SQL语句是将教师信息表中表示教师所在院系编号的列删除。其中,T_ teacher表示教师信息表的名字;DROP关键字表示要对指定列进行删除;deptID是指教师信息表中表示教师所在院系编号的列。

4.5.6 删除一个约束条件

如果在数据表中将某一个列的约束条件删除,可以使用ALTER TABLE语句中的DROP子句。其删除约束条件的语法格式如下:

        ALTER TABLE table_name DROP constraint_type

其中,ALTER TABLE是修改表结构的关键字;关键字ALTER TABLE之后跟的table_name是表的名字;DROP是关键字,用来表示要将数据表中列的约束条件删除;关键字DROP后面需要指定要删除约束条件的名字;constraint_type表示要删除的约束条件。

例4.16 删除院系信息表中的主键。

        ALTER TABLE T_dept   DROP PRIMARY KEY

这段SQL语句是将院系信息表中的主键约束删除。其中,T_dept表示院系信息表的名字;DROP关键字表示要对列的约束条件进行删除;PRIMARY KEY表示主键约束。