
SQL ALTER TABLE简介
标准查询语言(SQL)中的ALTER TABLE命令用于添加、删除或修改现有数据表中的列,通过重新命名它们或改变它们的数据类型。它还用于添加或删除现有列上的约束,如UNIQUE, NOT NULL, PRIMARY KEY, CHECK等。ALTER是一个数据定义语言(DDL)命令,与数据表中的记录无关。它只关注表结构的修改。
首先,让我们学习一下在SQL中编写ALTER TABLE语句时使用的语法。
语法和参数
下面是一些用于编写ALTER TABLE命令的简化语法。
(i) 添加一个新列
ALTER TABLE table_name ADD column_name datatype;
(ii) 删除一个现有的列
ALTER TABLE table_name DROP column_name;
(iii) 重命名一个现有的列
ALTER TABLE table_name RENAME column_name_old TO column_name_new;
(iv) 改变一个现有列的数据类型
ALTER TABLE table_name ALTER COLUMN column_name TYPE new_data_type;
(v) 在一个现有的列上添加一个约束条件
ALTER TABLE table_name ADD CONSTRAINT constraint_name constraint_condition;
(v) 放弃一个现有的约束条件
ALTER TABLE table_name DROP CONSTRAINT constraint_name ;
在上述语法中使用的参数如下。
**table_name:**正在执行ALTER语句的表
**column_name:**被添加、删除或修改的列
**constraint_name:**需要添加或删除的约束的名称
**constraint_condition。**对正在创建的约束的描述
SQL ALTER TABLE的例子
为了说明在SQL中使用ALTER TABLE语句,让我们创建一个名为 "学生 "的虚拟表。然后,我们可以使用下面的代码片断来执行上述任务。
CREATE TABLE students (
roll_no int NOT NULL PRIMARY KEY,
student_name VARCHAR(255),
degree_major VARCHAR(255) NOT NULL,
degree_year VARCHAR(255),
society VARCHAR(255)
);
创建了学生表后,让我们在表中插入几条记录。
INSERT INTO students(
roll_no, student_name, degree_major, degree_year, society)
VALUES (1,'Mohith K','Computer Science Engineering','IV','Dramatics'),
(2,'Ayesha Khan','Electrical Engineering','I','Music'),
(3,'Kylie Green','Computer Science Engineering','III','Choreography'),
(4,'Alisha Rojer','Chemical Engineering','III','Music'),
(5,'Andy Bernard','Geosciences','IV','Dramatics');
select * from students;

现在,我们准备在学生表的帮助下尝试几个基于ALTER语句的例子。
例子#1 - 在现有的表中增加一个新的列
在学生表中添加一个数据类型为VARCHAR(255)的新列 "contact"。
ALTER TABLE students ADD COLUMN contact VARCHAR(255);
该命令已成功执行。让我们在SELECT语句的帮助下检查一下表是否已经发生了变化。
SELECT * FROM students;

上图中突出显示的列是新添加的 "contact "列。
例2--删除一个现有的列
从学生表中删除 "contact "列。
假设新创建的列 "contact "在学生表中不再需要了。那么,我们可以使用ALTER命令删除它。
ALTER TABLE students
DROP COLUMN contact;
让我们看看联系人列是否被删除。
SELECT * FROM students;

可以看出,上述列已经被成功删除。
例3 - 重命名一个现有的列
将学生表中的 "roll_no "列重命名为 "student_id"。
ALTER TABLE students
RENAME COLUMN roll_no to student_id;
SELECT * FROM students;

学生表中的 "roll_no "列已经成功重命名为 "student_id"。
例子#4 - 改变一个现有列的数据类型
将 "student_id "列的数据类型从INT改为VARCHAR(50)。
ALTER TABLE students
ALTER COLUMN student_id TYPE VARCHAR(50);
student_id列的数据类型已经成功地改变为VARCHAR或字符变化。从下面的图片中可以看出。
SELECT * FROM students;

例子#5 - 在一个现有的列上添加NOT NULL约束
在学生表中的 "degree_year "列上添加一个NOT NULL约束。
ALTER TABLE students
ALTER COLUMN degree_year SET NOT NULL;
select * from students;

NOT NULL约束已经成功地添加到 "degree_year "列中。下面是几条INSERT语句来进一步说明。
INSERT INTO students(
student_id, student_name, degree_major, degree_year, society)
VALUES (6,'Ron Weasley','chemistry',NULL,'Music');

在这个插入查询中,我们试图在degree_year列中插入一个NULL值。它给出了一个错误。请仔细阅读错误信息。
现在让我们试试另一个没有任何NULL值的查询。
INSERT INTO students(
student_id, student_name, degree_major, degree_year, society)
VALUES (6,'Ron Weasley','chemistry','II','Music');
看,这个被成功执行了。在SELECT语句的帮助下,可以看到学生表中的新行。
SELECT * FROM students;

例子 #6 - 移除现有列上的NOT NULL约束
在学生表的 "degree_year "列上删除NOT NULL约束条件。
ALTER TABLE students
ALTER COLUMN degree_year DROP NOT NULL;
select * from students;
该查询成功返回,并显示输出如下。

让我们为 "degree_year "列插入一条带有NULL值的新记录。
INSERT INTO students(
student_id, student_name, degree_major, degree_year, society)
VALUES (7,'Ross Geller','Paleontology',NULL,'Dramatics');
与前面的例子不同,INSERT查询的完成没有任何错误。
SELECT * FROM students;

请看第7行;degree_year的值是NULL。
例子 #7 - 在一个现有的列上添加CHECK约束
在学生表中的 "degree_year "列上添加一个CHECK约束,使其只能容纳(I, II, III, IV, V)中的值。
ALTER TABLE students
ADD CONSTRAINT year_check CHECK(degree_year IN ('I','II','III','IV','V'));
select * from students;

该约束已被成功添加。让我们用degree_year写一个INSERT查询,它不满足CHECK约束。
INSERT INTO students(
student_id, student_name, degree_major, degree_year, society)
VALUES (8,'Harvey Ross','Chemistry','VI','Music');

正如预测的那样,服务器抛出了一个错误。仔细阅读这个错误。
现在试试另一个INSERT查询,从上述集合中的学位_年份。
INSERT INTO students(
student_id, student_name, degree_major, degree_year, society)
VALUES (8,'Harvey Ross','Chemistry','III','Music');

这个查询被成功执行;因此,检查约束已经被成功应用。
例子#8 - 删除现有列上的PRIMARY KEY约束
删除学生表中 "student_id "列的PRIMARY KEY约束。
ALTER TABLE students
DROP CONSTRAINT students_pkey;
students_pkey约束是在CREATE TABLE语句中创建的。现在它已被成功删除。在学生表的约束下,它不再被提及。

例子#9 - 在现有列上添加PRIMARY KEY约束
在学生表中的 "student_id "和 "student_name "列上添加PRIMARY KEY约束。
ALTER TABLE students
ADD CONSTRAINT students_pk PRIMARY KEY(student_id, student_name);
该查询成功返回。在约束标题下可以看到新创建的约束 "students_pk"。

总结
SQL中的ALTER TABLE命令用于添加、删除、重命名和修改现有的表及其列。当我们想改变一个现有表的结构而不需要创建一个新的表时,它就变得非常有用。