您的位置:首页 > 数据库 > MySQL

mysql创建修改删除表和库

2015-11-01 17:50 603 查看
数据库就跟一个操作系统一样, 使用管理员用户要小心点。

一、库的创建、修改、删除
二、表的创建、修改、删除

[b]一、库的创建和删除[/b]
1、创建
用CREATE DATABASE指令。
我们先看一下帮助
MariaDB [hell]> help CREATE DATABASE;
Name: 'CREATE DATABASE'
Description:
Syntax:
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
[create_specification] ...

create_specification:
[DEFAULT] CHARACTER SET [=] charset_name
| [DEFAULT] COLLATE [=] collation_name
试一下:

MariaDB [hell]> CREATE DATABASE testdb;
Query OK, 1 row affected (0.03 sec)
MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| testdb             |
+--------------------+
5 rows in set (0.00 sec)
DATABASE关键字换成SCHEMA也可以,在Oracle数据库中是Schema。

在库已存在的情况下这样会报错,并退出语句,在执行一个语句脚本的时候不想这样退出。
可以加上IF NOT EXISTS。语句不会退出,不过会有一个警告。

MariaDB [(none)]> CREATE DATABASE testdb;
ERROR 1007 (HY000): Can't create database 'testdb'; database exists     #报错并退出
MariaDB [(none)]> CREATE DATABASE IF NOT EXISTS testdb;
Query OK, 1 row affected, 1 warning (0.00 sec)

MariaDB [(none)]> SHOW WARNINGS;
+-------+------+-------------------------------------------------+
| Level | Code | Message                                         |
+-------+------+-------------------------------------------------+
| Note  | 1007 | Can't create database 'testdb'; database exists |
+-------+------+-------------------------------------------------+
1 row in set (0.00 sec)

MariaDB [(none)]>
可以修改字符集和排序规则,而不是使用默认的。
create_specification:
[DEFAULT] CHARACTER SET [=] charset_name
| [DEFAULT] COLLATE [=] collation_name
MariaDB [(none)]> CREATE DATABASE testdb2 CHARACTER SET = utf8  COLLATE = utf8_bin;
Query OK, 1 row affected (0.00 sec)


用 SHOW CHARACTER SET; 和SHOW COLLATION;来查询字符集和排序规则。
排序规则是依附于字符集的。同一个符集有多个排序规则。
查看当前会话默认字符集:可以通过修改变量或配置文件来修改默认字符集。
MariaDB [(none)]> SHOW VARIABLES LIKE 'character%';
+--------------------------+----------------------------------------+
| Variable_name            | Value                                  |
+--------------------------+----------------------------------------+
| character_set_client     | utf8                                   |
| character_set_connection | utf8                                   |
| character_set_database   | latin1                                 |
| character_set_filesystem | binary                                 |
| character_set_results    | utf8                                   |
| character_set_server     | latin1                                 |
| character_set_system     | utf8                                   |
| character_sets_dir       | /usr/local/mysql5.5.46/share/charsets/ |
+--------------------------+----------------------------------------+
8 rows in set (0.00 sec)


2、修改
MariaDB [testdb1]> help alter database;
Name: 'ALTER DATABASE'
Description:
Syntax:
ALTER {DATABASE | SCHEMA} [db_name]
alter_specification ...
ALTER {DATABASE | SCHEMA} db_name
UPGRADE DATA DIRECTORY NAME

alter_specification:
[DEFAULT] CHARACTER SET [=] charset_name
| [DEFAULT] COLLATE [=] collation_name
一般就是修改字符集和排序规则。
UPGRADE DATA DIRECTORY NAME

用于重新更新数据库的数据字典的。 一般只是在数据库版本升级以后不兼容才会用。

3、删除数据库
用DROP DATABASE指令。

MariaDB [(none)]> HELP DROP DATABASE;
Name: 'DROP DATABASE'
Description:
Syntax:
DROP {DATABASE | SCHEMA} [IF EXISTS] db_name
MariaDB [(none)]> DROP DATABASE testdb;
Query OK, 0 rows affected (0.00 sec)
这个直接删除就可以了。

最后说一点:
如果要重命名数据库,最好的办法就是把表全部导出来, 然后删除库,再新建库,再导入表。不过代价也是很大的。最好是不要重命名。不要直接在文件系统中重命名数据库名,也就是目录名。因为一些元数据是不会变的。 因此千万不要直接修改身为数据库的目录名。
最后最好还是不要重命名。

二、表的创建、修改、删除
1、创建
CREATE TABLE
看一下帮助,这个有点多,不过主要分的是几个部分。
下面就是总的部分,创建表的主要指令。

MariaDB [(none)]> help create table;
Name: 'CREATE TABLE'
Description:
Syntax:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name    #TEMPORARY临时表,在内存中的。只有管理员可以使用。
(create_definition,...)         #定义创建表的信息,主要是与字段相关的。在一个大括号。
[table_options]                 #关于表的选项。
[partition_options]            #划分表,这个就不说了。

Or:

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
[(create_definition,...)]
[table_options]
[partition_options]
select_statement

Or:

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
{ LIKE old_tbl_name | (LIKE old_tbl_name) }
三种创建方式。第一种就是一般创建,第二种是通过查询到的数据填充到表里,表结构自动定义,第三种是根据另一张表的结构来自动创建表。暂时先只说第一种方式的。

举个例子看看
MariaDB [(none)]> use testdb1;    #默认数据库
Database changed
MariaDB [testdb1]> CREATE TABLE tab1 (Name char(20));    #创建表
Query OK, 0 rows affected (0.04 sec)

MariaDB [testdb1]>
创建一个简单的表tab1。括号里面的就是定义的表的信息了,Name字段,char数据类型,长度20。

看一下下面这个,就是定义的格式了。

定义创建表的信息。

create_definition:
col_name column_definition
| [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...)
[index_option] ...
| {INDEX|KEY} [index_name] [index_type] (index_col_name,...)
[index_option] ...
| [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY]
[index_name] [index_type] (index_col_name,...)
[index_option] ...
| {FULLTEXT|SPATIAL} [INDEX|KEY] [index_name] (index_col_name,...)
[index_option] ...
| [CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (index_col_name,...) reference_definition
| CHECK (expr)
包括字段名称字段定义或者是约束和索引
约束和索引可以先不去管它,只要知道这里是专门单独的给各个字段定义约束和索引的。

而在字段定义中也可以给所对应的字段定义一些约束。
上面的约束和索引包括:

上面的CONSTRAINT是可以省略的。
PRIMARY KEY 定义主键约束
UNIQUE 唯一键约束

FULLTEXT|SPATIAL 是用来定义全文和空间索引。

FOREIGN KEY 外键约束
CHECK 条件约束

字段定义的说明部分:

column_definition:
data_type [NOT NULL | NULL] [DEFAULT default_value]
[AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY]
[COMMENT 'string']
[COLUMN_FORMAT {FIXED|DYNAMIC|DEFAULT}]
[STORAGE {DISK|MEMORY|DEFAULT}]
[reference_definition]
字段的定义又包括数据类型和类型修改符。数据类型太多了,就不帖出来了。

AUTO_INCREMENT: 自动增长
UNIQUE 唯一键约束
PRIMARY KEY 主键终束
COMMENT: 注释信息

使用大致就是:
CREATE TABLE table_name (col_name data_type 类型修饰 | 约束) table_option

再举个例子:
MariaDB [testdb1]> CREATE TABLE tab2 (Name CHAR(20) NOT NULL UNIQUE);
Query OK, 0 rows affected (0.05 sec)

MariaDB [testdb1]> CREATE TABLE tab6 (ID int UNSIGNED AUTO_INCREMENT PRIMARY KEY,Name CHAR(20));
Query OK, 0 rows affected (0.02 sec)

MariaDB [testdb1]> CREATE TABLE tab7 (ID int UNSIGNED AUTO_INCREMENT,Name CHAR(20),PRIMARY KEY (id));
Query OK, 0 rows affected (0.09 sec)

MariaDB [testdb1]>
第一个是创建有非空和唯一约束的字段Name。
第二个的UNSIGNED是int数据类型的一部分,表示无符号的。并且是直接在字段中定义了主键约束。
第三个在字段之外单独给字段定义主键约束。

还有表选项,主要会用到的:
ENGINE [=] engine_name
AUTO_INCREMENT [=] value 指定AUTO_INCREMENT从几开始的。
[DEFAULT] CHARACTER SET [=] charset_name 字符集。
[DEFAULT] COLLATE [=] collation_name
COMMENT [=] 'string' 给表加注释
DELAY_KEY_WRITE [=] {0 | 1} 延迟写入,合并多个写入请求,一次性写入。
ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT} 表格式。
TABLESPACE tablespace_name [STORAGE {DISK|MEMORY|DEFAULT}]
可以指定所存放的表空间文件, 还可以指定放在DESK或MEMORY内存中。DEFAULT一般就是指DISK。

MariaDB [testdb1]> CREATE TABLE tab8 (ID INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, Name CHAR(25) NOT NULL,age TINYINT UNSIGNED NOT NULL, gender ENUM('M','N') NOT NULL, ps VARCHAR(50)) ENGINE=MyISAM COMMENT 'test table';
Query OK, 0 rows affected (0.05 sec)

MariaDB [testdb1]> SHOW TABLE STATUS LIKE 'tab8'\G
*************************** 1. row ***************************
Name: tab8
Engine: MyISAM
Version: 10
Row_format: Dynamic
Rows: 0
Avg_row_length: 0
Data_length: 0
Max_data_length: 281474976710655
Index_length: 1024
Data_free: 0
Auto_increment: 1
Create_time: 2015-11-01 04:12:47
Update_time: 2015-11-01 04:12:47
Check_time: NULL
Collation: utf8_general_ci
Checksum: NULL
Create_options:
Comment: test table
1 row in set (0.00 sec)

MariaDB [testdb1]>
MariaDB [testdb1]> DESC tab8;
+--------+---------------------+------+-----+---------+----------------+
| Field  | Type                | Null | Key | Default | Extra          |
+--------+---------------------+------+-----+---------+----------------+
| ID     | int(10) unsigned    | NO   | PRI | NULL    | auto_increment |
| Name   | char(25)            | NO   |     | NULL    |                |
| age    | tinyint(3) unsigned | NO   |     | NULL    |                |
| gender | enum('M','N')       | NO   |     | NULL    |                |
| ps     | varchar(50)         | YES  |     | NULL    |                |
+--------+---------------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

MariaDB [testdb1]>


第二种方式是用SELECT来从别的表获取数据,再用这些数据填充出来一张表。不过跟原来的表结构就不同了。这样,我们先在刚才的表里插入一些数据。
MariaDB [testdb1]> INSERT INTO tab8 (Name,age,gender) VALUES ('XIAOA',25,'M'),('ZHANGSAN',30,'M'),('XIAOHUI',28,'N');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

MariaDB [testdb1]> SELECT * FROM tab8;
+----+----------+-----+--------+------+
| ID | Name     | age | gender | ps   |
+----+----------+-----+--------+------+
|  4 | XIAOA    |  25 | M      | NULL |
|  5 | ZHANGSAN |  30 | M      | NULL |
|  6 | XIAOHUI  |  28 | N      | NULL |
+----+----------+-----+--------+------+
3 rows in set (0.00 sec)

MariaDB [testdb1]>


试一下:
MariaDB [testdb1]> CREATE TABLE tab9 SELECT * FROM tab8;
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0

MariaDB [testdb1]> DESC tab9;
+--------+---------------------+------+-----+---------+-------+
| Field  | Type                | Null | Key | Default | Extra |
+--------+---------------------+------+-----+---------+-------+
| ID     | int(10) unsigned    | NO   |     | 0       |       |
| Name   | char(25)            | NO   |     | NULL    |       |
| age    | tinyint(3) unsigned | NO   |     | NULL    |       |
| gender | enum('M','N')       | NO   |     | NULL    |       |
| ps     | varchar(50)         | YES  |     | NULL    |       |
+--------+---------------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
跟原来的表对比一下就发现ID的主键约束没有了,自动增长也没有了。

第三种方式是专门用来复制表结构的。
MariaDB [testdb1]> CREATE TABLE tab10 LIKE tab8;
Query OK, 0 rows affected (0.01 sec)
tab10与tab8的结构一模一样,不过是空的。不过如果想把tab8的数据复制过来,可以用INSERT INTO 的SELECT自动的加入数据。

2、修改

alter table

MariaDB [testdb1]> help alter table;
Name: 'ALTER TABLE'
Description:
Syntax:
ALTER [ONLINE | OFFLINE] [IGNORE] TABLE tbl_name
[alter_specification [, alter_specification] ...]
[partition_options]
在alter_specification里面主要就是:
ADD新字段或索引,ALTER给字段修改或增加默认值,change字段重命名、定义属性还有字段的位置(排在第几个字段),MODIFY修改字段定义和位置,DROP删除字段,rename表重命名,ORDER BY指定排序标准的字段,CONVERT TO CHARACTER SET charset_name [COLLATE collation_name] 转换字符集及排序规则,还有表项(与创建表时候的表项一样)。

举例子说明吧
ADD
ADD [COLUMN] col_name column_definition
[FIRST | AFTER col_name ]
ADD添加字段。class字段,数据类型 char,默认值'math'。上面的first是把字段放到第一个位置,after就是在某个字段之后。

MariaDB [testdb1]> ALTER TABLE tab8 ADD class CHAR(30) DEFAULT 'math';
Query OK, 4 rows affected (0.02 sec)
Records: 4  Duplicates: 0  Warnings: 0
只添加单个字段可以这样,如果一下添加多个字段就要用括号括起来,并用逗号分割各个字段。
MariaDB [testdb1]> ALTER TABLE tab8 ADD (weight tinyint unsigned, height tinyint unsigned);
Query OK, 4 rows affected (0.01 sec)
Records: 4  Duplicates: 0  Warnings: 0


ALTER:给gender字段添加默认值为'M'。
MariaDB [testdb1]> ALTER TABLE tab8 ALTER gender SET DEFAULT 'M';
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0


CHANGE:class字段改为course,并放到Name字段的后面。 每次改名必须要重新定义字段。
MariaDB [testdb1]> ALTER TABLE tab8 CHANGE class course char(30) default 'math' AFTER Name;
Query OK, 4 rows affected (0.02 sec)
Records: 4  Duplicates: 0  Warnings: 0
MariaDB [testdb1]> DESC tab8;
+--------+---------------------+------+-----+---------+----------------+
| Field  | Type                | Null | Key | Default | Extra          |
+--------+---------------------+------+-----+---------+----------------+
| ID     | int(10) unsigned    | NO   | PRI | NULL    | auto_increment |
| Name   | char(25)            | NO   |     | NULL    |                |
| course | char(30)            | YES  |     | math    |                |
| age    | tinyint(3) unsigned | NO   |     | NULL    |                |
| gender | enum('M','N')       | NO   |     | M       |                |
| ps     | varchar(50)         | YES  |     | NULL    |                |
| PPS    | char(39)            | YES  |     | NULL    |                |
| weight | tinyint(3) unsigned | YES  |     | NULL    |                |
| height | tinyint(3) unsigned | YES  |     | NULL    |                |
+--------+---------------------+------+-----+---------+----------------+
9 rows in set (0.00 sec)


MODIFY:gender的enum类型值写错了,改一下。
MariaDB [testdb1]> ALTER TABLE tab8 MODIFY gender ENUM('M','F');
Query OK, 4 rows affected, 2 warnings (0.01 sec)
Records: 4  Duplicates: 0  Warnings: 2
有警告,因为我们表里面有数据,原来为N的值变成空了。可以用update重新赋值。如:
MariaDB [testdb1]> UPDATE tab8 SET gender = 'F' WHERE gender=''; #这里表示是空字符,如果用gender IS NULL,就不行了。
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2  Changed: 2  Warnings: 0


DROP:删除字段。
MariaDB [testdb1]> ALTER TABLE tab8 DROp ps;
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0


RENAME:
MariaDB [testdb1]> ALTER TABLE tab8 RENAME TO tab0;
Query OK, 0 rows affected (0.01 sec)

MariaDB [testdb1]>
修改表名有个专门的指令,就叫做RENAME.
mysql> RENAME TABLE old_name TO new_name;


修改表项中的存储引擎的时候注意一下。

修改引擎的背后工作机制 是创建一个所指定引擎的新表, 并把老的表中的数据导入新表中,是存在风险的。

都是简单的用法,复杂的就朋友们自己研究吧。

3、删除

MariaDB [testdb1]> help drop table;
Name: 'DROP TABLE'
Description:
Syntax:
DROP [TEMPORARY] TABLE [IF EXISTS]
tbl_name [, tbl_name] ...
[RESTRICT | CASCADE]
这个就不举例子了,注意的是CASCADE,有时候一个表是被另一个表所关联的。加上CASCADE就是把所有关联的表也一起删除。

简单的使用,谢谢大家。

本文出自 “大蕃茄” 博客,请务必保留此出处http://fanqie.blog.51cto.com/9382669/1708559
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: