DDL语句--修改表

修改表是指修改数据库中已经存在的表的定义。修改表比重新定义表简单,不需要重新加载数据,也不会影响正在进行的服务。

MySQL中通过ALTER TABLE语句来修改表,修改表包括修改表名,修改字段数据类型,修改字段名,增加字段,删除字段,修改字段的排列位置,更改默认存储引擎和删除表的外键约束等。

OK,这篇博客会详细的整理到上面的几种修改表的方式。现在我们开始。

  • 1,修改表名

表名可以在一个数据库中唯一的确定一张表。数据库系统通过表名来区分不同的表。注意的是,数据库中的表是唯一的,数据库中不可能存在两张相同的表。

MySQL中通过sql语句ALTER TABLE来实现表名的修改,语法形式如下:

ALTER TABLE 旧表名 RENAME [TO] 新表名;

其中,‘旧表名’参数表示修改前的表名,‘新表名’参数表示修改后的新表名,TO参数是可选参数,这个属性是否在语句中出现不会影响语句的执行。rename的意思就是重命名,所以这个挺好记的。

OK,现在我们来实际操作下数据库。我们现在数据库中创建一张表,建表语句如下:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(5) COLLATE utf8_bin NOT NULL,
  `card_id` varchar(20) COLLATE utf8_bin DEFAULT NULL,
  `age` int(11) DEFAULT '25',
  PRIMARY KEY (`id`),
  UNIQUE KEY `age_UNIQUE` (`card_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

现在我们修改下上面user表的表名:

ALTER TABLE linkinframe.user RENAME linkinframe.usr;

OK,修改成功,我们查看下新的表,表结构和之前的表结构一致,里面的数据与之前的数据也一致。

  • 2,修改字段的数据类型

字段的数据类型包括整数型,浮点数型,字符串型,二进制类型,日期和时间类型等。数据类型决定了数据的存储格式,约束条件和有效范围。表中的每个字段都有数据类型。

MySQL中,ALTER TABLE语句也可以修改字段的数据类型。基本语法如下:

ALTER TABLE 表名 MODIFY 属性名 数据类型;

其中,‘表名’参数指所要修改的表的名称,‘属性名’参数指需要修改的字段的名称,‘数据类型’参数值修改后的新的数据类型。

OK,现在我们来实际操作下MySQL,首先我们建一张user表,建表语句如下:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(5) COLLATE utf8_bin NOT NULL,
  `card_id` varchar(20) COLLATE utf8_bin DEFAULT NULL,
  `age` int(11) DEFAULT '25',
  PRIMARY KEY (`id`),
  UNIQUE KEY `age_UNIQUE` (`card_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

现在我们修改name字段的长度为varhcar(10),执行如下的sql语句来修改:

ALTER TABLE linkinframe.`user` MODIFY name varchar(10) NOT NULL;

修改后我们查看下数据库现在表结构,成功修改了name属性的长度了。

  • 3,修改字段名

字段名是一张表中唯一的一个字段。数据库系统通过字段名来区分表中的不同字段。MySQL中,ALTER TABLE语句也可以修改表的字段名,基本语法如下:

ALTER TABLE 表名 CHANGE 旧属性名 新属性名 新数据类型;

其中,‘旧属性名’参数指修改前的字段名,‘新属性名’参数指修改后的字段名,‘新数据类型’参数指修改后的数据类型,如不需要修改,则将新数据类型设置成与原来的一样。

具体有2种情况:

  • 1),只修改字段名

使用ALTER TABLE 语句直接修改字段名,不改变字段的数据类型。建表语句:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(10) COLLATE utf8_bin NOT NULL,
  `card_id` varchar(20) COLLATE utf8_bin DEFAULT NULL,
  `age` int(11) DEFAULT '25',
  PRIMARY KEY (`id`),
  UNIQUE KEY `age_UNIQUE` (`card_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

现在我们修改name字段为username字段,执行如下语句来修改:

ALTER TABLE linkinframe.`user` CHANGE name username varchar(10) NOT NULL;

修改后的表结构如下:

当然其中的数据也没有变化:

  • 2),修改字段名和字段数据类型

使用ALTER TABLE语句直接修改字段名和该字段的数据类型。建表语句:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(5) COLLATE utf8_bin NOT NULL,
  `card_id` varchar(20) COLLATE utf8_bin DEFAULT NULL,
  `age` int(11) DEFAULT '25',
  PRIMARY KEY (`id`),
  UNIQUE KEY `age_UNIQUE` (`card_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

现在我们修改name字段为username字段,然后我们将name原来的长度修改成为10,执行如下语句来修改:

ALTER TABLE linkinframe.`user` CHANGE name username varchar(10) NOT NULL;

修改后的表结构如下:

  • 3),总结

MODIFY和CHANGE都可以改变字段的数据类型。不同的是:

1,CHANGE可以在改变字段数据类型的同时,改变字段名。MODIFY只能用来改变字段的数据类型,不能修改字段名。

2,CHANGE如果不改变字段名,只修改字段类型,CHAGE后面必须跟两个同样的字段名。

3,养成良好的习惯,如果是指修改字段的数据结构就使用MODIFY,如果要修改字段名+数据结构就使用CHANGE。

4,在修改表的字段过程中,如果表中已经有记录,修改数据类型时应该特别小心。因为,修改数据类型时可能会影响表中的数据。

5,特别注意的是,字符类型的字段最好不要改成整数类型,浮点数类型。

  • 4,增加字段

在创建表时,表中的字段就已经定义完成。如果要增加新的字段,可以通过ALTER TABLE语句进行增加,在MySQL中,ALTER TBALE语句增加字段的基本语法如下:

ALTER TABLE 表名 ADD 属性名1 数据类型 [完整性约束条件] [FIRST | AFTER 属性名2];

其中,‘属性名1’参数指需要增加的字段的名称,‘数据类型’参数指新增加字段的数据类型,‘完整性约束条件’是可选参数,用来设置新增字段的完整性约束条件;‘FIRST’参数也是可选参数,其作用是将新增字段设置为表的第一个字段,‘AFTER 属性名

2’参数也是可选参数,其作用是将新增字段添加到‘属性名2’所指的字段后。如果执行的sql语句中没有‘FIRST’,‘AFTER 属性名2’参数指定新增字段的位置,新增的字段默认为表的最后一个字段。

具体有如下4种情况:

  • 1),增加无完整性约束条件的字段

一个完整的字段包括字段名,数据类型和完整性约束条件,增加字段一般都是包括上述内容。当然,根据实际情况,一些字段也可以不用完整性约束条件进行约束。

现在我们来实际操作下,数据库建表语句如下:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(5) COLLATE utf8_bin NOT NULL,
  `card_id` varchar(20) COLLATE utf8_bin DEFAULT NULL,
  `age` int(11) DEFAULT '25',
  PRIMARY KEY (`id`),
  UNIQUE KEY `age_UNIQUE` (`card_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

现在我们user表中添加一个phone字段:

ALTER TABLE linkinframe.`user` ADD phone varchar(11);

OK,添加字段成功,这里没有设置‘FRIST’和‘AFTER 属性名2’参数来指定插入位置,所以新增字段默认为表的最后一个字段。

  • 2),增加有完整性约束条件的字段

增加字段时可以设置该字段的完整性约束条件,如设置字段是否为空,是否为主键,是否为外键,默认值和是否为自增类型等约束条件。

现在我们来实际操作下,数据库建表语句如下:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(5) COLLATE utf8_bin NOT NULL,
  `card_id` varchar(20) COLLATE utf8_bin DEFAULT NULL,
  `age` int(11) DEFAULT '25',
  PRIMARY KEY (`id`),
  UNIQUE KEY `age_UNIQUE` (`card_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

现在我们user表中添加一个phone字段:

ALTER TABLE linkinframe.`user` ADD phone varchar(11) NOT NULL;

OK,添加字段成功,这里没有设置‘FRIST’和‘AFTER 属性名2’参数来指定插入位置,所以新增字段默认为表的最后一个字段。

  • 3),表的第一个位置增加字段

默认情况下,新增字段为表的最后一个字段。如果加上FIRST参数,则可以将新增字段设置为表的第一个字段。

现在我们来实际操作下,数据库建表语句如下:

CREATE TABLE linkinframe.`user` (
    `name` varchar(5) COLLATE utf8_bin NOT NULL,
  `card_id` varchar(20) COLLATE utf8_bin DEFAULT NULL,
  `age` int(11) DEFAULT '25',
	UNIQUE KEY `age_UNIQUE` (`card_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

现在我们user表中添加一个id字段,然后设置id为user表的主键,而且放到表中的第一个位置上。

ALTER TABLE linkinframe.`user` ADD `id` int(11) primary KEY AUTO_INCREMENT first;

OK,添加成功,而且成功的放到了表中的第一个字段上面了。

  • 4),表的指定位置之后增加字段

在增加字段时,由于特殊原因需要在表的指定位置增加字段,如果加上‘AFTER 属性名2’参数,那么新增的字段插入在‘属性名2’后面。

现在我们来实际操作下,数据库建表语句如下:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(5) COLLATE utf8_bin NOT NULL,
  `card_id` varchar(20) COLLATE utf8_bin DEFAULT NULL,
  `age` int(11) DEFAULT '25',
  PRIMARY KEY (`id`),
  UNIQUE KEY `age_UNIQUE` (`card_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

现在我们user表中name字段之后添加一个phone字段:

ALTER TABLE linkinframe.`user` ADD phone varchar(11) after name;

OK,添加字段成功,表中phone字段成功的放到了name字段之后。

  • 总结:

1,增加字段时,如果能够加上完整性约束条件,一定要加上。这样可以保证此字段的安全性,甚至可以提高整个表的数据的安全性。

2,对于一个数据库来说,字段的排列顺序对表不会有什么影响。但是对于创建表的人来说,将有某种直接或者间接关系的字段放在一起,会更加好的理解这个表的结构,这其实也是一种习惯,我们以后也要尽量将有关系的字段放在一起,方便我们查看。

  • 5,删除字段

删除字段是指删除已经定义好的表中的某个字段,在表创建完成之后,如果发现某个字段需要删除,可以采用将整个表都删除,然后重新创建一张表的做法。这样做是可以达到目的的,但必然会影响到表中的数据,而且操作比较麻烦。

MySQL中,ALTER TABLE语句也可以删除表中的字段,语法如下:

ALTER TABLE 表名 DROP 属性名;

其中,‘属性名’参数指需要从表中删除的字段的名称。

现在我们来实际操作下,数据库建表语句如下:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(5) COLLATE utf8_bin NOT NULL,
  `card_id` varchar(20) COLLATE utf8_bin DEFAULT NULL,
  `age` int(11) DEFAULT '25',
  PRIMARY KEY (`id`),
  UNIQUE KEY `age_UNIQUE` (`card_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

现在我们user表中删除掉name字段:

ALTER TABLE linkinframe.`user` DROP name;

OK,成功删除了。

  • 6,修改字段的排列位置

创建表的时候,字段在表中的排列位置都已经确定了,如果要改变字段在表中的排列位置,也可以通过ALTER TABLE来处理。MySQL中,修改字段排列位置的ALTER TABLE语句的基本语法如下:

ALTER TABLE 表名 MODIFY 属性名1 数据类型 FIRST|AFTER 属性名2;

其中,‘属性名1’参数指需要修改位置的字段的名称,‘数据类型’参数指‘属性名1’的数据类型,‘FIRST’参数指定位置为表的第一个位置,‘AFTER 属性名2’参数指定‘属性名1’插入到‘属性名2’之后。

具体的分2种情况:

  • 1),字段修改到第一个位置

FIRST参数可以指定字段为表的第一个字段。

现在我们来实际操作下,数据库建表语句如下:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(5) COLLATE utf8_bin NOT NULL,
  `card_id` varchar(20) COLLATE utf8_bin DEFAULT NULL,
  `age` int(11) DEFAULT '25',
  PRIMARY KEY (`id`),
  UNIQUE KEY `age_UNIQUE` (`card_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

现在我们user表中的name字段修改到数据库的第一个位置上去:

ALTER TABLE linkinframe.`user` modify name varchar(5) first;

OK,显示name字段已经到了user表的第一个位置上了。

  • 2),字段修改到指定位置

‘AFTER’参数可以将字段排在表中指定的字段之后。

现在我们来实际操作下,数据库建表语句如下:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(5) COLLATE utf8_bin NOT NULL,
  `card_id` varchar(20) COLLATE utf8_bin DEFAULT NULL,
  `age` int(11) DEFAULT '25',
  PRIMARY KEY (`id`),
  UNIQUE KEY `age_UNIQUE` (`card_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

现在我们user表中的name字段修改到age之后去:

ALTER TABLE linkinframe.`user` modify name varchar(5) after age;

OK,显示name字段已经到了user表中age之后了。

  • 总结:

修改字段的排列位置其实也就是修改表的字段,这里由于没有修改字段名,所以我们可以使用MODIFY来操作字段的位置,当然我们也可以使用CHANGE来操作字段的位置,只不过这个时候属性名要写2遍而已。

比如说我现在不自己写sql,然后使用MySQL的客户端来调整下表中的2字段的位置使用的就是CHANGE。

ALTER TABLE `linkinframe`.`user`
CHANGE COLUMN `name` `name` VARCHAR(5) CHARACTER SET 'utf8' NULL DEFAULT NULL AFTER `id`;

  • 7,更改表的存储引擎

MySQL存储引擎是指MySQL数据库中表的存储类型。MySQL存储引擎包括InnoDB,MyISAM,Memory等。不同的表类型有着不同的优缺点,在前面的博客中我也已经整理到了。

在创建表时,存储引擎就已经设定好了。如果要改变,可以通过重新创建一张表来实现。这么做是可以达到目的的,但必然会影响到表中的数据,而且操作比较麻烦。

MySQL中,ALTER TABLE语句也可以更改表的存储引擎的类型,其基本语法如下:

ALTER TABLE 表名 ENGINE=存储引擎名

其中,‘存储引擎名’参数指设置的新的存储引擎的名称。

现在我们来实际操作下,数据库建表语句如下:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(5) COLLATE utf8_bin NOT NULL,
  `card_id` varchar(20) COLLATE utf8_bin DEFAULT NULL,
  `age` int(11) DEFAULT '25',
  PRIMARY KEY (`id`),
  UNIQUE KEY `age_UNIQUE` (`card_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

现在我们user表中的存储引擎设置为MyISAM:

ALTER TABLE linkinframe.`user` ENGINE = MyISAM;

OK,现在我们SHOW CREATE TABLE看下user的表结构,现在user表的存储引擎成功的变成了MyISAM。

注意:使用Alter语句可以改变表的存储引擎,这可以避免重新创建表。但是,如果表中已经有很多的数据,改变存储引擎可能会造成一些意料之外的影响。如果一个表中已经存在了很多数据,最好不要轻易更改其存储引擎。

  • 8,删除表的外键约束

外键是一个特殊字段,其将某一表与其父表建立关联关系。在创建表的时,外键约束就已经设定好了。由于特殊需要,与父表之间的关联关系需要去除,要求删除外键约束。

MySQL中,ALTER TABLE语句也可以删除表的外键约束。其基本语法如下:

ALTER TABLE 表名 DROP FOREIGN KEY 外键别名:

其中,‘外键别名’参数指创建表时设置的外键的代号。

现在我们来实际操作下,数据库建表语句如下:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(5) COLLATE utf8_bin NOT NULL,
  `card_id` varchar(20) COLLATE utf8_bin DEFAULT NULL,
  `age` int(11) DEFAULT '25',
  PRIMARY KEY (`id`),
  UNIQUE KEY `age_UNIQUE` (`card_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
CREATE TABLE `address` (
  `id` int(11) NOT NULL,
  `user_id` int(11) DEFAULT NULL,
  `name` varchar(45) COLLATE utf8_bin DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `user_id_idx` (`user_id`),
  CONSTRAINT `user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

现在我们删除掉从表address的外键关联,执行如下sql:

ALTER TABLE linkinframe.address DROP foreign key user_id;

OK,查询结果显示从表address的外键已经不存在了。

时间: 2024-10-14 11:48:58

DDL语句--修改表的相关文章

SQL语句修改表名和字段名

今天有个临时任务,修改生产环境的数据库表名和字段名.以前要修改表名字段名都是在开发环境,直接打开 SQL Server找到对应的表或字段重命名就OK啦,可是这是线上数据库,再想直接F2修改是不可能的啦.怎么办?乖 乖写脚本呗.上网了解了一些相关资料,结合我自己操作过程中出现的一些实际问题简单作个总结,再次加深下印 象. SQL自带了一系列的系统存储过程.其中sp_rename就具有修改表名和列名的功能.对于sp_rename是这样定 义的:更改当前数据库中用户创建对象(如表.列或用户定义数据类型

DDL语句--创建表

表是数据库存储数据的基本单位.一个表包含若干字段和记录.表的操作包含创建新表,修改表,删除表.这些操作都是数据库管理中最基本,也是最重要的操作. 具体而言,关于表的相关操作如下: 1,创建表的方法 2,表的完整性约束条件 3,查看表结构的方法 4,修改表的方法 5,删除表的方法 上面罗列的这些都会一一的整理到.OK,现在我们开始第一篇,创建表. 创建表是指在已存在的数据库中创建新表,这是建立数据库最重要的一步,是进行其他表操作的基础.MySQL中创建表通过sql语句CREATE TABLE实现,

mysql如何用sql语句修改表字段?

1.今日任务根据下表用sql语句创建表结构 2.在创建上图表结构的时候,不小心把最后一个字段写成了全大写的STATUS,看着实在不协调,于是准备修改这个字段 3.修改的方法有很多种 1.我用的是mysql数据库,可以直接选择表,右键设计表,直接修改保存就ok 2.或者直接DROP TABLE 表把表删除,重新CREATE TABLE表来新建表 2.但是我需要的是用sql语句来修改,输入下图sql语句运行一下就修改成功了 注意:有的人看到这受影响的行数为0,就要问一句到底有没有修改成功,答案是有的

DDL语句--改动表

改动表是指改动数据库中已经存在的表的定义.改动表比又一次定义表简单.不须要又一次载入数据.也不会影响正在进行的服务. MySQL中通过ALTER TABLE语句来改动表.改动表包含改动表名.改动字段数据类型,改动字段名.添加字段,删除字段,改动字段的排列位置.更改默认存储引擎和删除表的外键约束等. OK,这篇博客会具体的整理到上面的几种改动表的方式.如今我们開始. 1,改动表名 表名能够在一个数据库中唯一的确定一张表. 数据库系统通过表名来区分不同的表. 注意的是.数据库中的表是唯一的,数据库中

用 pt-online-schema-change在线修改表结构的时候报超时

用工具pt-online-scheme-change执行添加字段是报错,提示超时,在凌晨反复执行几次后都是在创建触发器的时候超时退出了,表并不是很大大概1000w数据 执行语句:pt-online-schema-change --user=root --password='xxxxxx' --host=127.0.0.1 --port=3306 --charset=utf8 --alter="add flow_n int(11)  default 1  COMMENT '数据流个数' "

sql server DDL语句 建立数据库 定义表 修改字段等

一.数据库:1.建立数据库 create database 数据库名;use 数据库名; create database exp1;use exp1; mysql同样 2.删除数据库 drop database 数据库名;drop database exp1; mysql同样 二.表:1.创建表 create table 表名(    列名1 类型1 [约束],    列名2 类型2 [约束],    ...); create table Student(    Sno Char(7) prim

MYSQL批量修改表前缀与表名sql语句

修改表名 ALTER TABLE 原表名 RENAME TO 新表名; 一句SQL语句只能修改一张表 show tables; 1. SELECT CONCAT( 'ALTER TABLE ', table_name, ' RENAME TO db_', substring(table_name, 4), ';' ) FROM information_schema. TABLES WHERE table_name LIKE 'ct%'; 批量复制一下到Notepad++中,只保留sql语句,再复

Oracle获取干净的建表DDL语句,不含其它存储、表空间、段属性

早上一个同事资讯怎么获取到建表语句而且是不带存储那种SQL.Oracle自己提供了一个函数DBMS_METADATA.GET_DDL,但是获取到的建表语句含有存储.表空间.以及一些其他段的属性.如图: 看到这个获取到的ddl语句,想通过利用Oracle函数来截取的方式获取建表语句. 思路为:1.通过get_ddl获取建表语句 abc2.将abc中的pctfree'替换成';'3.计算';'的位置4.用substr来截取abc,从开头到';'的长度 SQL如下: SELECT SUBSTR(REP

使用语句修改数据表结构

查询表信息: sp_help 'dbo.T_User'; 修改columnName 字段为空 alter table dbo.T_User alter column columnName datetime null; 修改columnName 默认值 ALTER TABLE dbo.T_User ADD CONSTRAINT [DF_T_User_columnName ] DEFAULT 0 FOR [columnName ]; 使用语句修改数据表结构