-
2021-03-18 15:06:36
mysql判断索引是否存在时删除索引的方法(mysql drop index if exists PROCEDURE)
mysql的drop index语句不支持if exists条件,在sql中先删除索引,
再创建索引,如果对于新建的数据库,库中没有该索引,就会报错,
导致后面的sql不再执行。
因此需要使用存储过程来判断索引是否存在,如果存在则删除。
sql代码如下:
Sql代码
DROP PROCEDURE IF EXISTS del_idx;
create procedure del_idx(IN p_tablename varchar(200), IN p_idxname VARCHAR(200))
begin
DECLARE str VARCHAR(250);
set @str=concat(' drop index ',p_idxname,' on ',p_tablename);
select count(*) into @cnt
if @cnt >0 then
PREPARE stmt FROM @str;
EXECUTE stmt ;
end if;
end ;
call del_idx('table_name','index_name');
ALTER TABLE table_name ADD INDEX index_name (column1, column2);
DROP PROCEDURE IF EXISTS del_idx;
create procedure del_idx(IN p_tablename varchar(200), IN p_idxname VARCHAR(200))
begin
DECLARE str VARCHAR(250);
set @str=concat(' drop index ',p_idxname,' on ',p_tablename);
select count(*) into @cnt from information_schema.statistics where table_name=p_tablename and index_name=p_idxname ;
if @cnt >0 then
PREPARE stmt FROM @str;
EXECUTE stmt ;
end if;
end ;
call del_idx('table_name','index_name');
ALTER TABLE table_name ADD INDEX index_name (column1, column2);
更多相关内容 -
MySQL DROP COLUMN
2021-01-19 01:43:52MySQL DROP COLUMN简介:在本教程中,我们将向您展示如何使用MySQL DROP COLUMN语句从表中删除列。MySQL DROP COLUMN语句简介在某些情况下,您希望从表中删除一个或多个列。在这种情况下,您使用ALTER TABLE DROP ...MySQL DROP COLUMN
简介:在本教程中,我们将向您展示如何使用MySQL DROP COLUMN语句从表中删除列。
MySQL DROP COLUMN语句简介
在某些情况下,您希望从表中删除一个或多个列。在这种情况下,您使用ALTER TABLE DROP COLUMN语句,如下所示:
ALTER TABLE table
DROP COLUMN column;
让我们更详细地研究一下这个语句:
首先,在ALTER TABLE子句后指定包含要删除的列的表。
其次,您将列的名称放在DROP COLUMN子句之后。
请注意,关键字COLUMN是可选的,因此您可以使用较短的语句,如下所示:
ALTER TABLE table
DROP column;
若要同时从表中删除多个列,请使用以下语法:
ALTER TABLE table
DROP COLUMN column_1,
DROP COLUMN column_2,
…;
在从表中删除列之前,您应记住一些重要的要点:
从表中删除列会使依赖于列的所有数据库对象(如存储过程,视图,触发器等)无效。例如,您可能有一个引用列的存储过程。删除列时,存储过程将变为无效。要修复它,您必须手动手动更改存储过程的代码。
必须同时更改依赖于已删除列的其他应用程序的代码,这需要时间和精力。
从大表中删除列可能会影响数据库的性能。
MySQL DROP COLUMN示例
首先,我们创建一个posts 表演示用。
CREATE TABLE posts (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
excerpt VARCHAR(400),
content TEXT,
created_at DATETIME,
updated_at DATETIME
);
其次,要删除excerpt列,请使用以下ALTER TABLE语句:
ALTER TABLE posts
DROP COLUMN excerpt;
第三,要同时删除两个列created_at和updated_at列,请使用以下语句:
ALTER TABLE posts
DROP COLUMN created_at,
DROP COLUMN updated_at;
MySQL删除一个带有外键列的示例
如果删除作为外键的列,MySQL将发出错误。让我们展示一下这个想法。
首先,创建一个名为categories的表:
CREATE TABLE categories (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255)
);
其次,将category_id列添加到posts表中。
ALTER TABLE posts ADD COLUMN category_id INT NOT NULL;
第三,将category_id列作为引用categories表的id列的外键。
ALTER TABLE posts
ADD CONSTRAINT fk_cat
FOREIGN KEY (category_id)
REFERENCES categories(id) ON DELETE CASCADE;
第四,从posts表中删除category_id列。
ALTER TABLE posts
DROP COLUMN category_id;
MySQL发出错误消息:
ERROR 1553 (HY000): Cannot drop index 'fk_cat': needed in a foreign key constraint
要避免此错误,必须在删除列之前删除外键约束。
在本教程中,我们向您展示了如何使用MySQL DROP COLUMN语句从表中删除一个或多个列。
-
MySQL Drop database不用跑路教学-full.pdf
2019-06-12 16:07:14MySQL Drop database不用跑路教学,这个太重要了,下载学习 -
mysql drop database删除数据库命令实例讲解
2020-12-15 20:44:38mysql drop database命令用于删除一个数据库,如果试图使用drop database命令删除一个不存在的数据库,那么那么你会收到此错误:ERROR 1008 (HY000): Can’t drop database ‘tutorial_database’; database doesn’... -
MySQL DROP TABLE语句语法
2021-01-18 18:25:43要删除现有表,请使用MySQLDROP TABLE语句。DROP TABLE语句的基本语法:DROP [TEMPORARY] TABLE [IF EXISTS] table_name [, table_name] ...[RESTRICT | CASCADE]DROP TABLE语句从数据库中永久删除表及其数据。在...要删除现有表,请使用MySQL DROP TABLE语句。DROP TABLE语句的基本语法:
DROP [TEMPORARY] TABLE [IF EXISTS] table_name [, table_name] ...
[RESTRICT | CASCADE]
DROP TABLE语句从数据库中永久删除表及其数据。在MySQL中,您还可以使用单个DROP TABLE语句删除多个表,每个表之间用逗号(,)分隔。
该TEMPORARY选项仅允许您删除临时表。它确保您不会意外删除非临时表。
该IF EXISTS选项仅在表存在时有条件地删除它。如果使用该IF EXISTS选项删除一个不存在的表,MySQL会生成一个NOTE,可以使用该SHOW WARNINGS语句来检索该NOTE 。
DROP TABLE例子
创建一个用于测试表insurances:
CREATE TABLE insurances (
id INT AUTO_INCREMENT,
title VARCHAR(100) NOT NULL,
effectiveDate DATE NOT NULL,
duration INT NOT NULL,
amount DEC(10 , 2 ) NOT NULL,
PRIMARY KEY(id)
);
使用DROP TABLE删除insurances表:
DROP TABLE insurances;
MySQL DROP TABLE删除多个表
首先,创建两个名为CarAccessories和的表CarGadgets:
CREATE TABLE CarAccessories (
id INT AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
price DEC(10 , 2 ) NOT NULL,
PRIMARY KEY(id)
);
CREATE TABLE CarGadgets (
id INT AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
price DEC(10 , 2 ) NOT NULL,
PRIMARY KEY(id)
);
DROP TABLE语句删除两个表:
DROP TABLE CarAccessories, CarGadgets;
MySQL DROP TABLE删除不存在的表
尝试删除一个不存在的表:
DROP TABLE aliens;
MySQL发出以下错误:
ErrorCode:1051.Unknowntable'classicmodels.aliens'
如果IF EXISTS在DROP TABLE语句中使用该选项:
DROP TABLE IF EXISTS aliens;
MySQL发出警告:
0 row(s) affected, 1 warning(s): 1051 Unknown table 'classicmodels.aliens'
要显示警告,可以使用以下SHOW WARNINGS语句:
SHOW WARNINGS;
-
MySQL DROP TABLE操作以及 DROP 大表时的注意事项【转】
2021-01-19 20:56:13删表DROP TABLE SyntaxDROP [TEMPORARY] TABLE [IF EXISTS]tbl_name [, tbl_name] ...[RESTRICT| CASCADE]可一次删除一张或多张表。需具有所删除表上的DROP权限。表定义文件和数据文件均被移除。表被删除后表上的...删表
DROP TABLE Syntax
DROP [TEMPORARY] TABLE [IF EXISTS]
tbl_name [, tbl_name] ...
[RESTRICT| CASCADE]
可一次删除一张或多张表。需具有所删除表上的DROP权限。表定义文件和数据文件均被移除。表被删除后表上的用户权限不会被自动删除。参数里表中指定的表名不存在则报错,但对于存在的表仍会删除。可通过指定IF EXISTS阻止表不存在时引发的错误(此时对于不存在的表仅产生一个NOTE)。对于分区表,除了移除表定义,分区、数据外还移除与之关联的分区定义文件(.par)。在MySQL5.6中参数[RESTRICT | CASCADE]不做任何事情。[TEMPORARY] 关键字表明只删临时表,语句不会结束正在进行的事务(MySQL中DDL语句会隐式提交),不会进行权限检查。
删库
DROP DATABASE Syntax
DROP {DATABASE| SCHEMA} [IF EXISTS] db_name...
删除指定库中的表之后删除库。需具有库上的DROP权限。库被删除后库上存在的用户权限不会被自动删除。IF EXISTS用于阻止库名不存在时引起的错误。库被删除后默认库会被重置。若在使用了符号链接的库上执行DROP DATABASSE 链接和原始数据库都会被删除。命令返回被移除的表数量。
该命令会从指定的数据库目录中移除常规操作时MySQL自己产生的文件和目录,如:.BAK .DAT .HSH .MRG. MYD .MYI .TRG .TRN .db.frm
.ibd .ndb .par,若存在db.opt也同样会删除。若数据库目录中存在其他非MySQL本身产生的文件或目录,则整个数据库目录不会被移除。此时,需手动清理剩余的文件并重新运行DROP DATABASE语句。
删除数据库并不会移除库中创建的临时表。临时表在SESSION结束时自动被清理或者显示的通过DROP TEMPORARY TABLE 删除。
删除大表的注意事项
对于表的删除,因为InnoDB引擎会在table cache层面维护一个全局独占锁一直到DROP
TABLE完成为止,这样,对于表的其他操作会被HANG住。对于较大的表来说,DROP
TABLE操作可能需要很长的时间,因此需要一种有效的办法来提升大表的删除速度,以尽可能降低HANG住的时间。可以通过设置硬链接来达到此目的。
比如有一个样例表:
example_table
使用InnoDB引擎且指定innodb_file_per_table=ON时在数据目录中与该表对应的有如下两个文件,分别为表定义文件和数据文件。
sudo ls -lh /data/mysql/testdb-rw-rw---- 1 mysql mysql 8.4K Oct 28 13:26example_table.frm-rw-rw---- 1 mysql mysql 100G Oct 28 13:26 example_table.ibd
该表有100G这么大,直接使用DROP TABLE来完成删表动作,那么这条语句要执行很长时间。此时便可以通过在该表对应的数据文件上设置硬链接来进行删除。
sudo ln /data/mysql/testdb/example_table.ibd /data/mysql/testdb/example_table.ibd.hdlksudo ls -lh /data/mysql/testdb-rw-rw---- 1 mysql mysql 8.4K Oct 28 13:26example_table.frm-rw-rw---- 2 mysql mysql 100G Oct 28 13:26example_table.ibd-rw-rw---- 2 mysql mysql 100G Oct 28 13:26 example_table.ibd.hdlk
发现多了一个example_table.ibd.hdlk文件,且example_table.ibd.hdlk和example_table.ibd的innode均为2。也即当有多个文件名(如硬链接)指向同一innode时,这个innode的引用数大于1,此时,删除其中任何一个文件名都只会删除指向innode的指针而并不会直接删除物理文件块,因此会非常快,直至innode的引用计数等于1时才会真正删除对应的物理文件块,真正删除物理文件块时才会比较耗时。
在建立了硬链接后再执行DROP TABLE操作:
DROP TABLE example_table;
发现会很快的完成,查看对应的表定义和数据文件:
sudo ls -lh /data/mysql/testdb-rw-rw---- 1 mysql mysql 100G Oct 28 13:26 example_table.ibd.hdlk
只剩下example_table.ibd.hdlk,且innode的引用计数变为了1。也即刚才的DROP TABLE操作实施删除了物理文件的一个指针example_table.ibd ,因而非常快。
剩下的任务就是删除真正的物理文件了,因为此时innode的引用计数已经变为了1,直接删除example_table.ibd.hdlk便会真正的删除物理文件。但因为物理文件较大,删除大文件仍会引起较高的磁盘IO开销。因此可以使用少量逐次删除的方式来删除大的数据文件。truncate工具可以用于增加或缩减指定文件的尺寸,可以用于此目的:
for i in `seq 100 -1 1 ` ;do sleep 2;sudo truncate -s ${i}G /data/mysql/testdb/example_table.ibd.hdlk;done
sudo rm -rf /data/mysql/testdb/example_table.ibd.hdlk;
从100G开始,每次缩减1G,停2秒,继续,直到文件只剩1G,最后使用rm命令删除剩余的部分。
对于整个数据库的删除可以先删除其中较大的表,最后在执行DROP DATABASE删除整个库,对大表的删除可参见上面的方法。
转自
MySQL DROP TABLE操作以及 DROP 大表时的注意事项 - CSDN博客 https://blog.csdn.net/zyz511919766/article/details/40539333
-
MySQL DROP TABLE操作以及 DROP 大表时的注意事项
2021-01-18 23:20:24语法:删表DROP TABLE SyntaxDROP [TEMPORARY] TABLE [IF EXISTS]tbl_name [, tbl_name] ...[RESTRICT | CASCADE]可一次删除一张或多张表。需具有所删除表上的DROP权限。表定义文件和数据文件均被移除。表被删除后表... -
MySQL DROP TABLE语句删除表
2021-01-17 13:53:02Summary: in this tutorial, we will show you how to remove existing tables using theMySQL DROP TABLEstatement.MySQL DROP TABLE statement syntaxIn order to remove existing tables, you use the MySQLDR... -
【MySQL】MySQL drop,truncate,delete 区别.pdf
2021-09-14 09:41:52【MySQL】MySQL drop,truncate,delete 区别.pdf -
MySQL DROP TABLE会完全删除表还是仅删除结构?
2021-02-07 07:30:48DROP TABLE会完全删除该表,并且还会删除所有数据。如果要完全删除所有数据并需要表结构,则可以使用...为此,我们将首先创建一个表-mysql>createtableDemoTable(IdintNOTNULLAUTO_INCREMENTPRIMARYKEY,Namev... -
mysql drop table的时候卡住了
2019-09-11 16:44:53mysql> show processlist; +----+------+-----------------+-------+---------+------+----------+------------------+ | Id | User | Host | db | Command | Time | State | Info ... -
MySQL DROP表卡死解决方案
2020-11-13 16:47:55场景:同事要删除一张表,数据量3308条,数据量不大,但drop表,一直卡着。。。。。。 分析:MySQL如果频繁的修改一个表的数据,那么这么表会被锁死。造成假死现象。 解决: 1.首先执行: show full processlist... -
Mysql drop function xxxx ERROR 1305 (42000): FUNCTION (UDF) xxxx does not exist
2021-01-30 02:32:37drop function GetEmployeeInformationByID;ERROR 1305 (42000): FUNCTION (UDF) GetEmployeeInformationByID does not existmysql> DELETE FROM mysql.func WHERE name='GetEmployeeInformationByID';... -
无备份情况下恢复MySQL drop table
2019-04-18 20:29:38这里我们首先来测试innodb_file_per_table为off的情况,即表结构和数据存在同一个文件中。这里我分别测试了表存在主键和不存在主键的...mysql> use recover; Reading table information for completion of tabl... -
MySql drop database时报错:Error dropping database can't rmdir
2017-05-18 22:13:52在删除MySql的数据库时,通过客户端程序、命令行控制器删除数据库时,都报错:ERROR 1010 (HY000): Error dropping database (can't rmdir './db_test', errno: 39)解决方法: 直接去到MySql的数据目录,直接把... -
MYSQL缓慢的drop table 操作_MySQL
2021-01-20 01:30:12大家都知道,Ext3并不是最有效的文件系统,例如,删除文件会...当您运行DROP TABLE时,会有好几件事情需要去做:对表进行write lock,这样它不会被其他线程使用;存储引擎删除数据文件;当然,最后MySQL会删除表定义文件... -
(笔记)Mysql命令drop table:删除数据表
2021-01-19 08:48:43例如,删除表名为 MyClass 的表:mysql> drop table MyClass;DROP TABLE用于删除一个或多个表。您必须有每个表的DROP权限。所有的表数据和表定义会被取消,所以使用本语句要小心!注意:对于一个带分区的表,DROP... -
【mysql】drop、truncate和delete的区别
2022-03-03 10:52:55drop:删除数据库2. 对比 TRUNCATE TABLE 和 DELETE FROM3. DDL 和 DML 的说明 1. drop:删除数据库 drop语句将表所占用的空间全释放掉。 drop > truncate > delete 方式1:如果要删除的数据库存在,则删除... -
MySQL DROP TABLE删除表报错'ERROR 1051 (42S02): Unknown table'
2017-03-03 16:37:52删除表时报错 mysql> drop table gns_history_1; ERROR 1051 (42S02): Unknown table 'gnsdb.gns_h... -
【MySQL】DROP TABLE, TRUNCATE区别
2022-04-01 20:42:17DROP TABLE, TRUNCATE TABLE, DELETE TABLE 三种删除语句的区别 1.DROP TABLE 清除数据并且销毁表,是一种数据库定义语言(DDL Data Definition Language), 执行后不能撤销,被删除表格的关系,索引,权限等等都会... -
MySQL中DROPUSER语句的使用详解
2021-01-19 07:48:39MySQL中的DROP USER语句可用于完全从MySQL中删除用户帐户及其特权。但是在使用drop user语句之前,应该撤销用户的特权,或者换句话说,如果用户没有特权,那么可以使用drop user语句从Mysql数据库服务器删除用户。... -
mysql drop权限测试
2016-06-07 09:16:22在项目开发和测试中,常收到开发人员需求,需要建立数据库帐号和授权脚本,发现授权脚本中有基于库上的drop权限,按mysql的权限机制,drop权限比较大,能drop database,这个权限很危险,现在验证测试一下。... -
MYSQL DROP INDEX的BUG
2012-07-31 17:36:23DROP INDEX index_name on table_name时,如果table_name是大写,则会导致后续information_schema.statistics 表的访问问题。 环境:MYSQL 5.1.46 win32版本。 问题示例: use test; CREATE TABLE IF NOT EXISTS... -
【MySQL SQL语句】DROP TABLE简述
2021-09-10 17:25:44DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ... [RESTRICT | CASCADE] DROP TABLE:删除一个或多个表(你必须对每个表具有DROP权限)。 注意: 使用此语句时要小心操作! 对于每张表,该语句... -
Mysql 删除数据库drop database详细介绍
2021-01-20 00:49:56Mysql 删除数据库drop database方法-:使用cmd模式下载删除mysql> drop database school;此命名删除了school数据库。但如果school数据库不存在就会报错。所以完整的语句应该这么写:mysql> drop database if ... -
【MySQL】drop、truncate和delete的区别及效率
2022-02-07 16:28:29对于drop、truncate和delete,虽然简单,但是真要使用或者面试时候问到还是需要有一定的总结,自己也比较懒,前面很多人总结过了,但是并不完善,因此参看多篇文章之后进行一个总结。在此之前先简单了解下什么是DDL...