mysql对所有列的数据进行修改6_MySQL的SQL语句 - 数据定义语句(6)- ALTER TABLE 语句 (3)...

添加和删除列

使用ADD向表中添加新列,使用DROP删除现有列。DROP col_name是对标准SQL的MySQL扩展。

若要在表行的特定位置添加列,请使用FIRST col_name 或者 AFTER col_name。默认情况是添加到最后。

如果表只包含一列,则不能删除该列。如果您想要删除表,请使用DROP TABLE语句。

如果从表中删除列,那么列也将从其所属的任何索引中删除。如果组成一个索引的所有列都被删除,那么这个索引也会被删除。如果使用CHANGE或MODIFY缩短存在索引的列,而结果列长度小于索引长度,MySQL会自动缩短索引。

对于ALTER TABLE ... ADD,如果列具有使用非确定性函数的表达式默认值,则语句可能会产生警告或错误。

重命名、重新定义和重新排序列

CHANGE、MODIFY、RENAME COLUMN 和 ALTER子句允许更改现有列的名称和定义。它们具有以下比较特征:

●CHANGE:

■ 可以重命名列并更改其定义。

■ 具有比MODIFY、RENAME COLUMN更多的功能,但以牺牲某些操作的便利性为代价。如果不重命名,CHANGE 需要对列进行两次命名,如果只重命名,则需要重新指定列定义。

■ 使用FIRST或AFTER,可以对列重新排序。

●MODIFY:

■ 可以更改列定义,但不能更改列的名称。

■ 更改列定义而不重命名比 CHANGE 更方便。

■ 使用FIRST或AFTER,可以对列重新排序。

●RENAME COLUMN:

■ 可以更改列名,但不能更改其定义。

■ 在不更改列定义的情况下重命名列比CHANGE更方便。

●ALTER:仅用于更改列的默认值。

CHANGE是对标准SQL的MySQL扩展。MODIFY和RENAME COLUMN是用于Oracle兼容性的MySQL扩展。

若要更改列名称和定义,请使用CHANGE,指定新旧名称和新定义。例如,要将一个INT NOT NULL列从a重命名为b,并更改其定义为使用BIGINT数据类型,同时保留NOT NULL属性,请这样做:

20201211123031083993.png

若要更改列定义但不更改其名称,请使用CHANGE或MODIFY。使用CHANGE,语法需要两个列名,因此必须两次指定相同的名称才能保持名称不变。例如,要更改b列的定义,可以这样做:

20201211123031177597.png

MODIFY更方便在不改变名称的情况下改变定义,因为它只需要列名一次:

20201211123031271200.png

若要更改列名,但不更改其定义,请使用CHANGE或RENAME COLUMN。对于CHANGE,语法需要列定义,因此要保持定义不变,必须重新指定列当前具有的定义。例如,要将一个INT NOT NULL列从b重命名为a,请这样做:

20201211123031552011.png

RENAME COLUMN更方便在不改变定义的情况下更改名称,因为它只需要新旧名称:

20201211123031848423.png

通常,不能将列重命名为表中已经存在的名称。但是,有时情况并非如此,比如交换名称或在循环中移动名称。如果一个表有名为a、b和c的列,这些是有效的操作:

20201211123032066831.png

对于使用CHANGE或MODIFY进行的列定义更改,定义必须包括数据类型和应该应用于新列的所有属性,而不是索引属性(如PRIMARY KEY 或 UNIQUE)。原始定义中出现但未为新定义指定的属性将不进行继承。假设一个列col1被定义为INT UNSIGNED DEFAULT 1 COMMENT ‘my column‘,然后你按照如下方式修改该列,只打算将INT改为BIGINT:

20201211123032160435.png

该语句将数据类型从INT更改为BIGINT,但也删除了UNSIGNED、DEFAULT和COMMENT属性。为了保留它们,语句必须明确地包含它们:

20201211123032332041.png

对于使用CHANGE或MODIFY更改数据类型,MySQL尝试将现有的列值尽可能转换为新的类型。

警告

这种转换可能会导致数据的更改。例如,如果缩短字符串列,值可能会被截断。如果转换到新的数据类型会导致数据丢失,为了防止操作成功,请在使用ALTER TABLE之前启用严格SQL模式。

如果使用CHANGE或MODIFY缩短存在索引的列,而结果列长度小于索引长度,MySQL会自动缩短索引。

对于通过CHANGE或RENAME COLUMN重命名的列,MySQL自动将这些引用重命名为重命名列:

●引用旧列的索引,包括不可见的索引和禁用的MyISAM索引。

●引用旧列的外键。

对于通过CHANGE或RENAME COLUMN重命名的列,MySQL不会自动将这些引用重命名为重命名列:

●引用重命名列的生成列和分区表达式。必须如同ALTER TABLE语句中一样,使用CHANGE重新定义这些表达式。

●引用重命名列的视图和存储程序。必须手动更改这些对象的定义以引用新的列名。

若要对表中的列重新排序,请在CHANGE或MODIFY操作中使用FIRST和AFTER。

ALTER ... SET DEFAULT 或 ALTER ... DROP DEFAULT分别为列指定新的默认值或删除旧的默认值。如果旧的默认值被删除,并且列可以为NULL,那么新默认值为NULL。如果列不能为NULL, MySQL会分配一个默认值。

主键和索引

DROP PRIMARY KEY删除主键。如果没有主键,就会发生错误。

如果启用了sql_require_primary_key系统变量,尝试删除主键会产生错误。

如果在表中添加UNIQUE INDEX 或 PRIMARY KEY,MySQL会将其存储在任何非唯一索引之前,以便尽早检测重复键。

DROP INDEX删除索引。这是对标准SQL的MySQL扩展。要确定索引名称,请使用SHOW INDEX FROM tbl_name。

有些存储引擎允许在创建索引时指定索引类型。index_type说明符的语法是USING type_name。首选位置在列列表之后。在以后的MySQL版本中,将不再支持使用列列表之前的选项。

index_option值指定索引的其他选项。USING就是这样一个选项。

RENAME INDEX old_index_name TO new_index_name 重命名索引。这是对标准SQL的MySQL扩展。表的内容保持不变。old_index_name必须是表中未被ALTER TABLE语句删除的现有索引的名称。new_index_name是新的索引名,在应用了更改之后,它不能在结果表中索引名重复。两个索引名都不能是PRIMARY。

如果在MyISAM表上使用ALTER TABLE,那么将在单独的批处理中创建所有非惟一索引(如同REPAIR TABLE)。当有很多索引时,这会使ALTER TABLE更快。

对于MyISAM表,可以显式地控制键更新。使用ALTER TABLE ... DISABLE KEYS告诉MySQL停止更新非唯一索引。然后使用ALTER TABLE ... ENABLE KEYS 来重新创建丢失的索引。MyISAM使用一种特殊的算法来实现这一点,这种算法比逐个插入键要快得多,因此在执行批量插入操作之前禁用键应该会有相当大的速度提高。使用ALTER TABLE ... DISABLE KEYS除了前面提到的权限外,还需要INDEX权限。

虽然禁用了非惟一索引,但是对于SELECT和EXPLAIN等语句,它们会被忽略,否则它们将使用这些索引。

在使用ALTER TABLE语句之后,可能需要运行ANALYZE TABLE来更新索引基数信息。

ALTER INDEX操作允许将索引变为可见或不可见。优化器不使用不可见索引。索引可见性的修改适用于主键以外的索引(显式或隐式)。该特性与存储引擎无关(支持任何引擎)。

官方文档地址:

https://dev.mysql.com/doc/refman/8.0/en/alter-table.html

MySQL的SQL语句 - 数据定义语句(6)- ALTER TABLE 语句 (3)

标签:兼容性   ble   视图   支持   就会   属性   命名   sql语句   mamicode

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:https://blog.51cto.com/15023289/2560867

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/244783.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ant构建项目迁移到gradle_Gradle构建工具

构建工具的作用:依赖管理;测试、打包、发布;机器能干的活,绝不自己动手。主流构建工具:(1)Ant:编译、测试、打包;(2)Maven:依赖管理、发布;(3)Gradle:Groovy&…

mysql导入数据库某张表_MSSQLServer2005 导出导入数据库中某张表的数据

备注:在工作中我们经常会遇到,将数据库中某张数据表中的内容或数据导出来;今天我们就介绍怎样快速有效的进行数据导出,导入。使用的数据库版本为:mssqlserver2005。首先进行登录mssqlserver2005 ,如下图所示…

pyecharts运行了但是没有图_新版pyecharts,Python可视化so easy and powerful !

作者:chenjiandongx一个执迷于写 bug 的程序员pyecharts V1.0.0 版本正式发布啦!Whats New in pyecharts V1pyecharts 经过了半年的沉寂后,终于发布了新版本啦!新版本号将从 v1.0.0 开始,这是一个全新的,向…

python 整除及余数_python除法余数

广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 常量常量就是不变的变量,在python中,通常用大写的变量名表示常量,这一点…

flatmap用法_短说:map和flatmap

PS:本文阅读->理解->GET大概2-5分钟.也许你天天见到,但是一直没理解,占用你少量的时间,相信简单的东西,只需要你付出一点点时间.map和flatmap是Java8中stream的用法.>>>>>>map把数组流中的每一个值,使用所提供的函数执行一遍,一…

git 回退到某个commit_it lesson2 版本回退

回顾上次的知识:1,首先git init 初始化文件的状态,使用git管理文件。2,git add xxx 告诉git把xxx文件添加到仓库3,git commit -m ‘xxxx’告诉git把文件提交到仓库 并对提交的内容作解释(‘xxxx’&#xff…

python数据处理模块pandas_13. Python|模块总结:Pandas(数据处理)|【老W笔记】...

一、基本操作0. 导入模块import pandas as pd1. 新建DataFrame下面的例子中,我们新建一个有3条记录2列属性的表格。3 条记录分别是Tom,Bob,Alice的个人信息,2列属性分别是name和age。新建属性列的语法形如df[XX] List,…

visual studio 设计器不显示_与城共生:南京朝天宫“参与性”城市设计

本课题致力于探索和理解目前中国城市迅速发展的过程中,老旧社区如何与城市共生共进。通过对南京老旧社区的充分调查和研究,选取了朝天宫古玩市场附近的街巷民居和鼓楼工人新村作为设计地块。社会结构的变迁以及城市空间形态的变化都对老旧社区正在进行冲…

mysql error code 1093_MySQL更新时ErrorCode:1093和ErrorCode:1175的解决办法

Error Code: 1093. You canError Code: 1093. You cant specify target table ws_product for update in FROM clause这个是我们在使用update或者delete语句时,在where条件里面加入的子查询导致的。例如如下的update语句:update table set type static …

安装mysql8.019命令符_MySQL 8.0.19安装教程(windows 64位)

话不多说直接开干目录下载完成后解压解压完是这个样子配置初始化的my.ini文件的文件解压后的目录并没有的my.ini文件,没关系可以自行创建在安装根目录下添加的my.ini(新建文本文件,将文件类型改为的.ini),写入基本配置:[mysqld]# …

入Java_初入Java的方法

Java的方法类似于其他语言如C中的函数,比如我们第一个Java程序 输出Hello,world!中用到一个方法System.out.printfln();这里的printfln()就是一个方法,System是系统类,out是对象。1.什么是方法?方法是语句…

java method_JAVA Method的解析

java.lang.reflect.MethodMethodpublic final class Method extends Executable数据的层级结构Paste_Image.pngMethod中的方法boolean [equals].将此方法与指定的对象进行比较T extends [Annotation]T [getAnnotation]如果存在注释,则返回指定类型的注释否则返回为n…

java中this_多学习才能多赚钱之:java中this什么用

java中this什么用1、this调用当前属性:其主要作用是当需要给类中的数据进行初始化时,可以通过this来进行赋值,而不用随便定义一个变量来进行赋值,更有利于代码的阅读与理解(推荐教程:java教程)class Book{//定义书的类…

java api 英文_教你查阅Java API 英文文档(JDK 11)

然后找到“Specifications”并点击 API Documentation比如我们在别人的源码里看到了方法[也叫函数]: Scanner input new Scanner(System.in);所以搜索一下右上角 Scanner,对比我们看到的源码里import,发现是java.util包里的,所以…

jedis使用_Redis --Java客户端 Jedis

Redis --Java客户端 Jedis 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 简介 Jedis: 一款java操作redis数据库的工具. 菜鸟教程文档地址 使用…

找出最具竞争力的子序列_力扣300——最长上升子序列

这道题主要涉及动态规划,优化时可以考虑贪心算法和二分查找。原题给定一个无序的整数数组,找到其中最长上升子序列的长度。示例:输入: [10,9,2,5,3,7,101,18]输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。说明:可能会有多种最…

java 动态字符串_Java动态编译执行一串字符串,类似于Javascript里的eval函数

Javascript里的eval函数能动态执行一串js脚本。那Java里怎么做到呢。有两种方法:一种是使用可以执行js脚本的Java类 ScriptEngineManagerpublic static void main(String args[]){ScriptEngineManager manager new ScriptEngineManager();ScriptEngine se manager.getEngineB…

jquery全局变量_jQuery源码一个小细节,却很好地体现了性能优化的思想,很优秀...

写在前面听闻大佬们在写一些框架或者库的时候,到处都隐藏了一些细节,所以阅读他们的源代码,无论从性能优化、还是JS API的学习、亦或是代码风格等方面给到我们很多启发。这两天我翻看了一下jQuery1.x的源代码,看到了这么一段&…

mockito mock void方法_Spock如何模拟抽象类方法

我们平时写单元测试时经常会遇到调用抽象类或父类的方法,这些抽象方法可能是调用底层接口或数据库,需要mock掉,让抽象方法返回一个我们指定的值,以便测试当前代码逻辑的场景。下面讲下Spock如何结合power mock实现动态mock抽象方法…

new 实例化对象是啥意思_二. 初步认识JS中的类和对象

1 构造函数的定义在JS中, 没有类(class)的概念, 主要是通过构造函数来模拟的.语法function 构造函数名 () {// 函数体}使用function关键字表示定义一个构造函数构造函数名一般首字母大写示例function Person() {}通过以上方式就可以定义一个Person构造函数, 相当于定义好了一个…