2.修改表结构的语法
修改表结构使用alter table,修改表结构包括增加列定义、修改列定义、删除列、重命名列等操作。
①增加列定义的语法如下:
alter table 表名 add( #可以有多个列定义 column_namel datatype [default expr], ... );
上面的语法格式中圆括号部分与建表语法的圆括号部分完全相同,只是此时圆括号里的列定义是 追加到已有表的列定义后面。还有一点需要指出,如果只是新增一列,则可以省略圆括号,仅在add后紧跟一个列定义即可。为数据表增加字段的SQL语句如下:
# 为hehe数据表增加一个heheid字段,该字段的类型为int alter table hehe add hehe id int; 并为hehe数据表增加aaa、bbb字段,两个字段的类型都为varchar(255) alter table hehe add aaa varchar{255) default 'xxx', bbb varchar (255) );
上面第二条SQL语句增加aaa字段时,为该字段指定默认值为’xxx’。值得指出的是,SQL语句中的字符串不是用双引号引起而是用单到号引起的。
增加字段时需要注意:如果数据表中已有数据记录,除非给新增的列指定了默认植,否则新增的数据列不可指定非空约束,因为那些已有的记录在新增列上肯定是空(实际上,修改表结构很容易失败,只要新增的约束与已有数据冲突,修改就会失败)。
②修改列定义的语法如下:
alter table 表名 modify column_name datatype [default expr] [first|after col_name];
上面语法中first或者after col_name指定需要将目标修改到指定位置。
从上面修改语法中可以看出,该修改语句每次只能修改一个列完义,代码加下
# 将hehe表的hehe id列修改成varchar(255)出开 alter table hehe modifty hehe id varchar (255); 将hehe表的bbb列修改成1nt类型 alter table hehe modify bbb int;
从上面代码中不难看出,使用SOL修改数据表里列定义的语注和为数据夫只增加一个列定义的语法几平完全一样,关键是增加列定义使用add关键字,而修改列定义使用modify关键字。还有一点需要指出,add新增的列名必须是原表中不存在的,而modify修改的列名必须是原表中已存在的。 .
注意:
虽然MySQL的一个modify命令不支持一次修改多个列定义,但其他数据库如Oracle程序支持一个modify命令修改多个列定义,一个modify命令修改多个列定义的语法和一个add命令增加多个列定义的语法非常相似,也需要使用圆括号把多个列定义括起来。如果需要让MySQL支持一次修改多个列定义,则可在alter table后使用多个modify命令。
如果数据表里已有数据记录,则修改列定义非常容易失败,因为有可能修改的列定义规则与原有的数据记录不符合。如果修改数据列的默认值,则只会对以后的插入操作有作用,对以前已经存在的数据不会有任何影响。
③从数据表中删除列的语法比较简单:
alter table表名 drop column name
删除列只要在drop后紧跟需要删除的列名即可。例如:
# 删除hehe表中的aaa字段 alter table hehe drop aaa;
从数据表中删除列定义通常总是可以成功,删除列定义时将从每行中删除该列的数据,并释放该列在数据块中占用的空间。所以删除大表中的字段时需要比较长的时间,因为还需要回收空间。
上面介绍的这些增加列、修改列和删除列的语法是标准的SQL语法,对所有的数据库都通用。除此之外,MySQL还提供了两种特殊的语法:重命名数据表和完全改变列定义。
④重命名数据表的语法格式如下:
alter table表名 rename to 新表名
如下SQL语句用于将hehe表命名为wawa:
# 将hehe数据表重命名为wawa alter table hehe rename to wawai
MySQL 为alter table提供了change选项,该选项可以改变列名。change选项的语法如下
alter table表名 chanae old column_name new_column name type [default expr] [firstiafter col name]
对比chane和modify两个选项,不难发现:change选项比modify选项书了一个列名,因为change选项可以改变列名,所以它需要两个列名。一般而言,如果不需要改变列名,使用alter table 的modify选项即可,只有当需要修改列名时才会使用change选项。语句如下:
# 将wawa数据表的bbb字段重命名为ddd alter table wawa change bbb ddd int;
3.删除表的语法
删除表的语法格式如下:
drop table表名;
如下SQL语句将会把数据库中已有的wawa数据表删除:
# 删除数据表 drop table wawa;
删除数据表的效果如下。
- 表结构被删除,表对象不再存在。
- 表里的所有数据也被删除。
- 该表所有相关的索引、约束也被删除。
4. truncate表
对于大部分数据库而言,truncate都被当成DDL处理,truncate被称为“截断”某个表一一它的作用是删除该表里的全部数据,但保留表结构。相对于DML里的delete命令而言,truncate的速度要快得多,而且truncate不像delete 可以删除指定的记录,truncate只能一次性删除整个表的全部记录trucate 命令的语法如下:
truncate 表名
MySQL对truncate的处理比较特殊一 一如果使用非InnoDB存储机制,truncate 比 delete速度要快; 如果使用InnoDB存储机制,在MySQL5.0.3之前,truncate和delete完全一样,在5.0.3之后,n table 比 delete效率高,但如果该表被外键约束所参照,truncate又变为delete操作。在5.0.13之后, 速truncate总是可用,即比delete性能要好。
5 数据库约束
前面创建的数据表仅仅指定了一些列定义,这仅仅是数据表的基本功能。除此之外,所有的关系数据库都支持对数据表使用约束,通过约束可以更好地保证数据表里数据的完整性。约束是在表上强制执行的数据校验规则,约束主要用于保证数据库里数据的完整性。除此之外,当表中数据存在相互依赖性时,可以保护相关的数据不被删除。
大部分数据库支持下面5种完整性约束。
》NOTNULL:非空约束,指定某列不能为空。
》UNIOUE:唯一约束,指定某列或者几列组合不能重复。
》PRIMARY KEY:主键,指定该列的值可以唯一地标识该条记录。
》FOREIGN KEY:外键,指定该行记录从属于主表中的一条记录,主要用于保证参照完整性。
》CHECK:检查,指定一个布尔表达式,用于指定对应列的值必须满足该表达式
虽然大部分数据库都支持上面5种约束,但MySQL不支持CHECK约束,虽然MySQL的SQL语具也可以使用CHECK约束,但这个CHECK约束不会有任何作用,虽然的束的作用只是用于保证数据表里数据的完整性,但约束也是数据库对象,并被存储在系统表 中,也拥有自己的名字。根据约束对数据列的限制,约束分为如下两类。
》单列约束:每个约束只约束一列,
》多列约束:每个约束可以约束多个数据列,
为数据表指定约束有如下两个时机。
》建表的同时为相应的数据列指定约束
》建表后创建,以修改表的方式来增加约束
大部分约束都可以采用列级约束语法或者表级约束语法。下面依次介绍5种约束的建立和删除(约束通常无法修改)。
提示:
MySQL使用information_schema数据库里的TABLE_CONSTRAINTS表来保存该数
据库实例中所有的约束信息,用户可以通过查询TABLE _CONSTRAINTS表来获取该数据库的约束信息。
1.NOT NULL 约束
非空约束用于确保指定列不允许为空,非空约束是比较特殊的约束,它只能作为列级约束使用,只能使用列级约束语法定义。
这里介绍一下SQL中的null值,SQL中的null不区分大小写。
SQL中的null具有如下特征。
相为科据举型的值郁可以足“”、al、boolean等数地
所有数据类型的值都可以是null,包括int、float、boolean等数据类型。
与Java类似的是,空字符串不等于null,0也不等于null
除此之外,也可以在使用alter table修改表时增加或删除非空约束,SQL命令如下:
2. UNIQUE 约束
唯一约束用于保证指定列或指定列组合不允许出现重复值。虽然唯一约束的列不可以出现重复值,但可以出现多个null值(因为在数据库中null不等于null)
同一个表内可建多个唯一约束,唯一约束也可由多列组合而成。当为某列创建唯一约束时,MySQL为该列相应地创建唯一索引。如果不给唯一约束起名,该唯一约束默认与列名相同
唯一约束既可以使用列级约束语法建立,也可以使用表级约束语法建立。如果需要为多列建组合约束,或者需要为唯一约束指定约束名,则只能用表级约束语法。
当建立唯一约束时,MySQL在唯一约束所在列或列组合上建立对应的唯一索引。
使用列级约束语法建立唯一约束非常简单,只要简单地在列定义后增加unique关键字即可。SQL语句如下:
如果需要为多列组合建立明一约束,或者想自行指定约束名,则需要使用表级约束语法。表约语法格式如下:
(constraint 约束名] 约束定义
上面的表级的约束语法格式既可放在create table语有中与列定义并列,也可放在alter table语句中使用add关键字来添加约束。SOL语句如下:
上面的建表语句为test_name、 test_pass分别建立了唯一约束,这意味着这两列都不能出现重复值。除此之外,还可以为这两列组合建立唯一约束,SQL语句如下:
对于上面的unique_test2和unique_test3两个表,都是对test_name、test_pass建立唯一约束,其中 unique_test2要求test name、 test_pass都不能出现重复值,而unique_test3只要求test_name、 test_pass 两列值的组合不能重复。
也可以在修改表结构时使用add关键字来增加唯一约束,SQL语句如下:
#增加唯一约束 alter table unique_test3 add unique (test_name, test_pass);
还可以在修改表时使用modify关键字,为单列采用列级约束语法来增加唯一约束,代码如下:
# 为unique test3表的test_name列增加唯一约束 alter table unique_test3 modify test_name varchar (255) unique;
对于大部分数据库而言,删除约束都是在ater table语句后使用“drop constraint"约束名”语法来完成的,但MySQL并不使用这种方式,而是使用“drop index约束名”的方式来删除约束。例如如下SQL语句:
#删除unique_test3表上的test3_uk唯一约束 alter table unique_test3 drop index test3 uk;