标签:
修改表是指修改数据库中已经存在的表的定义。修改表比重新定义表简单,不需要重新加载数据,也不会影响正在进行的服务。
MySQL中通过ALTER TABLE语句来修改表,修改表包括修改表名,修改字段数据类型,修改字段名,增加字段,删除字段,修改字段的排列位置,更改默认存储引擎和删除表的外键约束等。
OK,这篇博客会详细的整理到上面的几种修改表的方式。现在我们开始。
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,修改成功,我们查看下新的表,表结构和之前的表结构一致,里面的数据与之前的数据也一致。
字段的数据类型包括整数型,浮点数型,字符串型,二进制类型,日期和时间类型等。数据类型决定了数据的存储格式,约束条件和有效范围。表中的每个字段都有数据类型。
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;
ALTER TABLE 表名 CHANGE 旧属性名 新属性名 新数据类型;其中,‘旧属性名’参数指修改前的字段名,‘新属性名’参数指修改后的字段名,‘新数据类型’参数指修改后的数据类型,如不需要修改,则将新数据类型设置成与原来的一样。
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;
修改后的表结构如下:
当然其中的数据也没有变化:
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;
修改后的表结构如下:
1,CHANGE可以在改变字段数据类型的同时,改变字段名。MODIFY只能用来改变字段的数据类型,不能修改字段名。
2,CHANGE如果不改变字段名,只修改字段类型,CHAGE后面必须跟两个同样的字段名。
3,养成良好的习惯,如果是指修改字段的数据结构就使用MODIFY,如果要修改字段名+数据结构就使用CHANGE。
4,在修改表的字段过程中,如果表中已经有记录,修改数据类型时应该特别小心。因为,修改数据类型时可能会影响表中的数据。
5,特别注意的是,字符类型的字段最好不要改成整数类型,浮点数类型。ALTER TABLE 表名 ADD 属性名1 数据类型 [完整性约束条件] [FIRST | AFTER 属性名2];
其中,‘属性名1’参数指需要增加的字段的名称,‘数据类型’参数指新增加字段的数据类型,‘完整性约束条件’是可选参数,用来设置新增字段的完整性约束条件;‘FIRST’参数也是可选参数,其作用是将新增字段设置为表的第一个字段,‘AFTER 属性名
2’参数也是可选参数,其作用是将新增字段添加到‘属性名2’所指的字段后。如果执行的sql语句中没有‘FIRST’,‘AFTER 属性名2’参数指定新增字段的位置,新增的字段默认为表的最后一个字段。
具体有如下4种情况:
现在我们来实际操作下,数据库建表语句如下:
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’参数来指定插入位置,所以新增字段默认为表的最后一个字段。
现在我们来实际操作下,数据库建表语句如下:
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;
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;
现在我们来实际操作下,数据库建表语句如下:
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;
2,对于一个数据库来说,字段的排列顺序对表不会有什么影响。但是对于创建表的人来说,将有某种直接或者间接关系的字段放在一起,会更加好的理解这个表的结构,这其实也是一种习惯,我们以后也要尽量将有关系的字段放在一起,方便我们查看。
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;
ALTER TABLE 表名 MODIFY 属性名1 数据类型 FIRST|AFTER 属性名2;其中,‘属性名1’参数指需要修改位置的字段的名称,‘数据类型’参数指‘属性名1’的数据类型,‘FIRST’参数指定位置为表的第一个位置,‘AFTER 属性名2’参数指定‘属性名1’插入到‘属性名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字段修改到数据库的第一个位置上去:
ALTER TABLE linkinframe.`user` modify name varchar(5) first;
OK,显示name字段已经到了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;现在我们user表中的name字段修改到age之后去:
ALTER TABLE linkinframe.`user` modify name varchar(5) after 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`;
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;
外键是一个特殊字段,其将某一表与其父表建立关联关系。在创建表的时,外键约束就已经设定好了。由于特殊需要,与父表之间的关联关系需要去除,要求删除外键约束。
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的外键已经不存在了。
标签:
原文地址:http://blog.csdn.net/u011794238/article/details/51027560