MySQL-19 DDL之数据表的修改

知识共享许可协议 版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons

一、语法

ALTER TABLE语句修改现有表的结构。它允许你添加一列, 放下一列,更改数据类型在列中添加主键, 重命名表还有更多。

1.1 修改表名

   alter table 表名 rename to 新的表名;
   RENAME TABLE  表名 TO 新的表名;

具体操作:
将学生表student改名成student2

        RENAME TABLE  student TO student2;
        alter table  student2 rename TO student3;

在这里插入图片描述
在这里插入图片描述

1.2修改表的字符集

      alter table 表名 character set 字符集名称;

具体操作:

	将sutden3表的编码修改成gbk
       ALTER TABLE student3 character set gbk;

在这里插入图片描述

1.3修改列类型

	 alter table 表名 modify 列名 新数据类型;

具体操作:
将student表中的remark字段的改成varchar(100)

       ALTER TABLE student MODIFY remark VARCHAR(100);

在这里插入图片描述

1.4修改列名称类型

	 alter table 表名 change 列名 新列别 新数据类型;

具体操作:
将student表中的remark字段名改成intro,类型varchar(30)

       ALTER TABLE student CHANGE remark intro varchar(30);

在这里插入图片描述

1.5 添加表列

     alter table 表名 add 新字段名  数据类型;

具体操作:
为学生表添加一个新的字段remark,类型为varchar(20)

     ALTER TABLE student ADD remark VARCHAR(20);

在这里插入图片描述

1.6 更改列语法

	ALTER TABLE table_name action1[,action2,…]
  • ALTER TABLE:改变;
  • table_name:数据表的名字;
  • action:列出要应用于表的一组操作。操作可以是添加新列、添加主键,或重命名表。这个ALTER TABLE语句允许您在单个操作中应用多个操作。ALTER TABLE语句,动作用逗号(,)分隔;

1.7 重命名表语法

由于业务需求发生变化,我们需要将当前表重命名为新表,以便更好地反映新情况。MySQL为我们提供了一个非常有用的语句,它可以更改一个或多个表的名称。

	 RENAME TABLE old_table_name TO new_table_name;
  • 旧数据表(old_table_name)必须存在,并且新表(new_table_name)绝对不能。

  • 如果新表new_table_name存在,语句就会报错。

  • 在执行RENAME TABLE语句之前,必须确保没有活动的事务或锁定的表。

  • 不能使用RENAME TABLE语句重命名临时表,但可以使用ALTER TABLE语句重命名临时表。

  • 我们还可以使用RENAME TABLE语句一次重命名多个表

     RENAME TABLE old_table_name_1 TO new_table_name_2,
          old_table_name_2 TO new_table_name_2,...
    

    ALTERTABLE语句可以重命名临时表,而RENAME TABLE语句则不能。

     ALTER TABLE old_table_name RENAME TO new_table_name;
    

1.8将列添加到表中

向现有表添加新列,请使用变更表 ADD COLUMN声明如下:

	ALTER TABLE table ADD [COLUMN] column_name column_definition [FIRST|AFTER existing_column];

若要同时向表添加两个或多个列,请使用以下语法:

ALTER TABLE table
ADD [COLUMN] column_name_1 column_1_definition [FIRST|AFTER existing_column],
ADD [COLUMN] column_name_2 column_2_definition [FIRST|AFTER existing_column],
...;

二、更改列

下面的语句创建一个名为tasks 在样本数据库:

mysql -u root -p
password;********
mysql>use testdb;
mysql>show tables;
mysql>CREATE TABLE task2(task_id INT NOT NULL,subject VARCHAR(45) NULL, start_date DATE NULL,end_date DATE NULL, description VARCHAR(200) NULL,PRIMARY KEY (task_id),UNIQUE INDEX task_id_unique (task_id ASC));
mysql>desc task2;

在这里插入图片描述
在这里插入图片描述

2.1 设置列的自动增量属性。

假设你想 task_id 列的值 将在任何时候自动增加一列。插入新行进入tasks数据表。要做到这一点,您可以使用ALTER TABLE语句设置task_id 列到AUTO_INCREMENT详情如下:

mysql>ALTER TABLE task2 CHANGE COLUMN task_id task_id INT(11) NOT NULL AUTO_INCREMENT;
mysql>desc task2;

在这里插入图片描述
可以通过将一些行插入到tasks数据表。

mysql>INSERT INTO task2(subject,start_date,end_date,description)VALUES('Learn MySQL ALTER TABLE',Now(),Now(), 'Practicing MySQL ALTER TABLE statement'); 
mysql>INSERT INTO task2(subject,start_date,end_date,description)VALUES('Learn MySQL CREATE TABLE',Now(),Now(), 'Practicing MySQL CREATE TABLE statement');
mysql>SELECT task_id, description FROM task2;

在这里插入图片描述

2.2将新列添加到表示例中。

由于新的业务需求,您需要添加新列叫complete中记录每个任务的完成百分比于task2数据表中。在这种情况下,您可以使用ALTER TABLE若要将新列添加到tasks下表如下

mysql>ALTER TABLE task2 ADD COLUMN complete DECIMAL(2,1) NULL AFTER description;
mysql>desc task2;

在这里插入图片描述

2.3从表示例中删除列

假设您不想将任务的描述存储在task2数据表中你得把它移开。下面的语句允许您在task2表中删除description 列

mysql>ALTER TABLE task2 DROP COLUMN description;
mysql>desc task2;

在这里插入图片描述

三、重命名表

3.1 重命名表

.第一步;创建一个新的数据库命名hr这包括两个表格:employees和departments为了演示

mysql -u root -p
password;********
mysql>CREATE DATABASE IF NOT EXISTS hr;
mysql>use hr;
mysql>CREATE TABLE departments (department_id INT AUTO_INCREMENT PRIMARY KEY,dept_name VARCHAR(100));
mysql>CREATE TABLE employees (id int AUTO_INCREMENT primary key,first_name varchar(50) not null,last_name varchar(50) not null,department_id int not null,FOREIGN KEY (department_id) REFERENCES departments (department_id));

在这里插入图片描述
第二步:在employees和departments表中插入样本数据

mysql>INSERT INTO departments(dept_name)VALUES('销售部'),('人力资源部'),('金融分析部'),('财务部'),('库管部'),('生产部');
mysql>INSERT INTO employees(first_name,last_name,department_id) VALUES('John','Doe',1), ('Bush','Lily',2), ('David','Dave',3), ('Mary','Jane',4), ('Jonatha','Josh',5), ('Mateo','More',1);

在这里插入图片描述
第三步:查看employees和departments表中的数据;

mysql>SELECT department_id, dept_name FROM departments;(MySQL RENAME TABLE departments Table)
mysql>SELECT  id, first_name, last_name, department_id FROM employees;(MySQL RENAME TABLE employees table)

在这里插入图片描述

3.2重命名视图引用的表

如果要重命名的表被视图引用,则重命名该表时该视图将变得无效,您必须手动调整该视图。
第一步:我们根据Employee和Department表创建一个名为v_Employee_info的视图,如下所示:

	mysql>CREATE VIEW v_employee_info as SELECT id, first_name, last_name, dept_name from employees inner join departments USING (department_id);

视图使用内部联接子句连接部门和雇员表。
第二步:SELECT语句返回v_Employee_info视图中的所有数据。

	mysql>SELECT   * FROM v_employee_info;	

在这里插入图片描述
第三步:我们将employees表重命名为People表,并再次从v_Employee_info视图中查询数据。

	mysql>RENAME TABLE employees TO people;
	mysql>SELECT   * FROM v_employee_info;(这时候MySQL会报错)

在这里插入图片描述
第四步:我们可以使用CHECKTABLE语句检查v_Employee_info视图的状态

	CHECK TABLE v_employee_info;

在这里插入图片描述
第五步:我们需要手动更改v_Employee_info视图,使其引用People表而不是Employees表。

3.3重命名存储过程引用的表

如果要重命名的表被存储过程引用,您必须像处理视图那样手动调整它。
第一步:首先,将People表重命名回Employees表

	RENAME TABLE people TO employees;

第二步:然后,创建一个名为get_Employee的新存储过程,它引用Employees表。

	DELIMITER $$
	CREATE PROCEDURE get_employee(IN p_id INT)BEGIN SELECT first_name ,last_name,dept_name FROM employees INNER JOIN departments using (department_id) WHERE id = p_id;
	END $$ 
	DELIMITER;

第三步:我们执行get_Employee表来获取id为1的雇员的数据

CALL get_employee(1);

在这里插入图片描述
第四步:我们将员工重新命名为People表。

RENAME TABLE employees TO people;

第五步:我们调用get_Employee存储过程来获取id为2的Employee的信息:

CALL get_employee(2);(错误:必须手动将存储过程中的Employees表更改为People表。)

在这里插入图片描述

3.4重命名具有引用外键的表

“部门”表使用Department_id列链接到Employees表。Employees表中的Department_id列是引用Department表的外键。

如果重命名“部门”表,则指向“部门”表的所有外键都不会自动更新。在这种情况下,我们必须手动删除并重新创建外键。

RENAME TABLE departments TO depts;

我们删除id为1的部门,因为存在外键约束,所以People表中的所有行也应该被删除。但是,我们将部门表重命名为DEPTS表,而不手动更新外键,MySQL将返回错误,

DELETE FROM depts  WHERE department_id = 1;(错误:无法删除或更新父行)

在这里插入图片描述

3.5重命名多个表

将“人员”和“部门”表重命名为“员工”和“部门”表:

	RENAME TABLE depts TO departments,people TO employees;

注意,RENAME TABLE语句不是原子的。这意味着如果发生任何错误,MySQL会将所有重命名的表回滚到它们的旧名称。

3.6重命名临时表

第一步:我们创建一个临时表,其中包含来自Employees表的LAST_NAME列的所有唯一姓氏

CREATE TEMPORARY TABLE lastnames SELECT DISTINCT last_name from employees;

在这里插入图片描述
第二步:我们使用RENAME表来重命名LASNAME表:

RENAME TABLE lastnames TO unique_lastnames;(错误:找不到文件)

在这里插入图片描述
第三部:我们使用ALTERTABLE语句来重命名LastNames表。

ALTER TABLE lastnames RENAME TO unique_lastnames;

第四步:我们从unique_lastname临时表中查询数据:

SELECT  last_name FROM  unique_lastnames;

在这里插入图片描述

四、添加列

mysql -u root -p
password;********
mysql>show databases;
mysql>use testdb;
mysql>CREATE TABLE IF NOT EXISTS vendors ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255));#创建一个表命名vendors
mysql>ALTER TABLE vendors ADD COLUMN phone VARCHAR(15) AFTER name;#添加了一个名为phone到vendors数据表中。因为我们指定了phone列之后显式地显示name列
mysql>ALTER TABLE vendors ADD COLUMN vendor_group INT NOT NULL;#添加了一个名为vendor_group到vendors数据表中。此时,我们没有指定新列的位置,因此MySQL在vendors数据表中添加了vendor_group列的最后一列。
mysql>INSERT INTO vendors(name,phone,vendor_group) VALUES('IBM','(408)-298-2987',1);#插入一些行进入vendors数据表中
mysql>INSERT INTO vendors(name,phone,vendor_group) VALUES('Microsoft','(408)-298-2988',1);#插入一些行进入vendors数据表中
mysql>SELECT id, name, phone,vendor_group FROM vendors;#查询.vendors表.的数据
mysql>ALTER TABLE vendors ADD COLUMN email VARCHAR(100) NOT NULL,ADD COLUMN hourly_rate decimal(10,2) NOT NULL;#再添加两列email和hourly_rate到vendors数据表中
mysql>SELECT id, name, phone, vendor_group, email, hourly_rate FROM vendors;#查询数据表;
mysql>ALTER TABLE vendors ADD COLUMN vendor_group INT NOT NULL;#如果不小心添加了表中已经存在的列,MySQL将发出错误。
mysql>SELECT  IF(count(*) = 1, 'Exist','Not Exist') AS result FROM information_schema.columns WHERE table_schema = 'classicmodels'AND table_name = 'vendors'AND column_name = 'phone';#添加列之前检查表中是否已经存在列

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Anrui23/article/details/94074588