一、DROP TABLE语句:用于删除数据表
基本格式:
drop table <table_name>
DROP [TEMPORARY] TABLE [IF EXISTS]
tbl_name [, tbl_name] ...
[RESTRICT | CASCADE]
TEMPORARY:用于删除临时表(推荐针对性使用),删除临时表不会结束当前的事务
IF EXISTS:用于在表不存在时,阻止错误消息的显示
[RESTRICT | CASCADE]:现在什么也不做
其实删表语法如上,还是挺简单的,但是当一个表被删除时,所有依赖于该表的对象也被删除(例如约束、索引、视图和权限等)
所以,删除表之前(注意):
①确认这个表没有人在使用,确实是一个废除的表
②看好确认是这个数据库的表
顺带提一下,如何重命名表:
RENAME TABLE tbl_name TO new_tbl_name
[, tbl_name2 TO new_tbl_name2] …
当然,可以使用ALTER TABLE语句替换该语句,如下……
二、ALTER TABLE语句:添加、修改和删除列
基本格式:
1.修改表名:alter table 原表名 rename to 新表名;
2.新增列:alter table 表名 add [column] 列名 varchar(20) ;
3.删除列:alter table 表名 drop [column] 列名;
4.修改列名: alter table 表名 change 原列名 新列名 varchar(20) ;
5.修改列属性:alter table 表名 modify 列名 varchar(20) ;
ALTER [IGNORE] TABLE tbl_name
ADD [COLUMN] col_name column_definition
[FIRST | AFTER col_name ]
|ADD [COLUMN] (col_name column_definition,...)
|MODIFY [COLUMN] col_name column_definition
[FIRST | AFTER col_name]
|DROP [COLUMN] col_name
|CHANGE [COLUMN] old_col_name new_col_name column_definition
[FIRST|AFTER col_name]
FIRST:表示表头行
AFTER col_name:表示在col_name的后面,即下一行(没有before选项)
##Copy一张TEAMS表用作示例
mysql> create table teams_copy
-> as
-> select * from TEAMS;
1、添加列
①新列自动成为表中的最后一个列,除非指定了FIRST或AFTER选项(表中已有的行在新列上自动得到NULL值或默认值)
例1:添加type列给teams_copy表中
mysql> alter table teams_copy
-> add type1 char(); #添加的新列归位最后一个列 mysql> alter table teams_copy
-> add type2 char() default''; #添加列的同时设置默认值 mysql> alter table teams_copy
-> add type3 char() after PLAYERNO; #指定新列的位置 mysql> select * from teams_copy;
+--------+----------+-------+----------+-------+-------+
| TEAMNO | PLAYERNO | type3 | DIVISION | type1 | type2 |
+--------+----------+-------+----------+-------+-------+
| | | NULL | first | NULL | |
| | | NULL | second | NULL | |
+--------+----------+-------+----------+-------+-------+
②如果添加新列时指定了NOT NULL约束
则:
字符串列自动得到空字符串;
数字列自动得到0;
日期类型自动得到0日期;
时间类型自动得到00:00:00
mysql> alter table teams_copy
-> add (
-> type4 char() NOT NULL,
-> type5 INTEGER NOT NULL,
-> type6 DATE NOT NULL,
-> tpye7 time not null );
mysql> select * from teams_copy; #截的一部分图
2、删除列
列值是否有数据都可以删除,依赖于该列的其它数据库对象,如索引、权限也将被删除
mysql> alter table teams_copy
-> drop type6; mysql> alter table teams_copy drop type2;
mysql> alter table teams_copy drop type4;
mysql> alter table teams_copy drop type5; #只能一列一列的删 mysql> select * from teams_copy;
+--------+----------+-------+----------+-------+----------+
| TEAMNO | PLAYERNO | type3 | DIVISION | type1 | tpye7 |
+--------+----------+-------+----------+-------+----------+
| | | NULL | first | NULL | :: |
| | | NULL | second | NULL | :: |
+--------+----------+-------+----------+-------+----------+
3、修改列---经常用到
基本格式:
alter table <表名> modify <列名> 数据类型(……) 选项;
1)修改列的宽度:
如果是增加列宽,都无所谓
如果是减少列宽,就必须保证原有的值要能放得下,否则出错
2)改变数据类型时,列中的值必须能转变为新的类型
mysql> desc student;
+-------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+-------+
| id | int() | NO | PRI | NULL | |
| name | varchar() | NO | | NULL | |
| sex | enum('M','F') | YES | | NULL | |
+-------+---------------+------+-----+---------+-------+
rows in set (0.00 sec) mysql> select * from student;
+----+--------+------+
| id | name | sex |
+----+--------+------+
| | 张三 | M |
| | 李四 | F |
| | 王五 | NULL |
+----+--------+------+
rows in set (0.00 sec) mysql> alter table student
-> modify id smallint not null;
Query OK, rows affected (0.29 sec)
Records: Duplicates: Warnings: mysql> alter table student
-> modify name int not null;
ERROR (HY000): Incorrect integer value: '张三' for column 'name' at row
解析:student表中id列值可转换为新的数据类型,但是name列的值无法转变,所以modify失败。
3)修改列名(不要加引号)
mysql> alter table student
-> change id 学号 int; mysql> select * from student;
+--------+--------+------+
| 学号 | name | sex |
+--------+--------+------+
| | 张三 | M |
| | 李四 | F |
| | 王五 | NULL |
+--------+--------+------+
4、修改约束
可以添加或删除约束,但是不能修改一个已有的约束。
ALTER [IGNORE] TABLE tbl_name
ADD [CONSTRAINT [symbol]] PRIMARY KEY(col_name,...)
|ADD [CONSTRAINT [symbol]] UNIQUE (col_name,...)
|ADD [CONSTRAINT [symbol]] FOREIGN KEY (col_name,...)
References parent_table(col_name)
|DROP PRIMARY KEY
|DROP FOREIGN KEY fk_symbo
|DROP {INDEX|KEY} index_name
示例:定义两张表t1和t2
mysql> create table t1(
-> a int not null primary key,
-> b int not null); mysql> create table t2(
-> a int not null primary key,
-> b int not null,
-> constraint c1 unique(b),
-> constraint fk1 foreign key(a) references t1(a)
-> ); 1)删除唯一性约束:删除对应的索引(index)即可
mysql> alter table t2
-> drop index c1; 2)给t1添加外键约束,取名fk2
mysql> alter table t1
-> add constraint fk2 foreign key(a) references t2(a); 3)删除外键fk2
mysql> alter table t1
-> drop foreign key fk2; 4)删除t1表的主键
mysql> alter table t1
-> drop primary key;