查看创建数据库的帮助:
mysql> HELP CREATE DATABASE; Name: 'CREATE DATABASE' Description: Syntax: CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [create_specification] ... //格式:CREATE 表示要执行创建动作;{DATABASE | SCHEMA} 表示创建的是数据库,关键字可以是DATABASE或者SCHEMA;[IF NOT EXISTS] 表示如果不存在,再创建;db_name 表示要创建的数据库的名字;[create_specification] 表示一些额外选项,如字符集和排序规则,在下面有专门解释 create_specification: [DEFAULT] CHARACTER SET [=] charset_name //[DEFAULT] 表示默认,可以不写;CHARACTER SET 关键子表示设置字符集; charset_name 表示具体的字符集格式;可以使用 SHOW CHARACTER SET;来查看当前版本mysql支持的字符集; | [DEFAULT] COLLATE [=] collation_name //COLLATE 关键字表示设置排序规则;collation_name 表示具体的排序规则格式;可以使用SHOW COLLATION;来查看当前版本mysql支持的排序规则
1,创建一个名为classes
的数据库,用来存放班级信息;设置字符集为gbk
,排序规则为gbk_chinese_ci
:
mysql> CREATE DATABASE IF NOT EXISTS classes CHARACTER SET = 'gbk' COLLATE = 'gbk_chinese_ci'; Query OK, 1 row affected (0.00 sec)
这时,可以在自己的mysql data
目录下,查看到创建了一个classes
的目录,用来存放该库的所有信息:
[root@mysql classes]# pwd //我的data目录在/mysql,可以看到创建了一个classes的目录,起始就是数据库名 /mysql/classes [root@mysql classes]# ls //查看到空的数据库,里面已经有了一个.opt文件 db.opt [root@mysql classes]# cat db.opt //里面具体内容是存放的字符集和排序规则 default-character-set=gbk default-collation=gbk_chinese_ci [root@mysql classes]# file db.opt //文加格式是ASCII test db.opt: ASCII text
在mysql交互模式下,查看创建的数据库:
mysql> USE classes //表示使用classes库,这是一个客户端命令,所以不用加分号 Database changed mysql> SHOW TABLES; //使用SHOW命令,表示查看该库的所有表,此时classes库内容为空 Empty set (0.00 sec)
为了实验,将继续演示修改表和删除表,这两个结束后,会重新创建一个classes
数据库,为后续表操作做基础。
一般来说,针对库修改,可以修改的有库的字符集和排序规则,后期还有升级数据字典名称等;库名称也可以修改,但是不建议,因为修改库名称的过程其实是重新创建一个新库,然后将数据重新写入新库的过程,在实际环境中这无疑是很消耗资源的
提示:可以关闭服务器,在数据目录对文件重命名;
查看修改库的帮助:
mysql> HELP ALTER DATABASE Name: 'ALTER DATABASE' Description: Syntax: ALTER {DATABASE | SCHEMA} [db_name] alter_specification ... //格式一:ALTER 关键字表示要执行修改操作; {DATABASE | SCHEMA} 表示对数据库进行修改操作,关键字可以是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 //表示修改排序规则具体格式
2,修改classes
数据库,将数据库的字符集更改为utf8
,排序规则更改为utf8_bin
:
mysql> ALTER DATABASE classes CHARACTER SET = 'utf8' COLLATE = 'utf8_bin'; Query OK, 1 row affected (0.00 sec)
此时,可以去mysql
的data
目录,查看classes
目录中的.opt
文件中的内容发生了改变:
[root@mysql classes]# pwd /mysql/classes [root@mysql classes]# cat db.opt default-character-set=utf8 default-collation=utf8_bin
库的删除是一个比较危险的动作,毕竟对于互联网行业,重中之中就是用户数据了。
查看删除库的帮助:
mysql> HELP DROP DATABASE Name: 'DROP DATABASE' Description: Syntax: DROP {DATABASE | SCHEMA} [IF EXISTS] db_name /格式:DROP 关键字表示要执行删除动作; {DATABASE | SCHEMA} 表示对数据库进行删除操作,关键字可以是DATABASE或SCHEMA; {IF EXISTS} 表示如果存在,则执行; db_name 表示具体的数据库
3,删除classes
数据库:
mysql> DROP DATABASE classes; Query OK, 0 rows affected (0.00 sec) mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | fsx | | mysql | | performance_schema | | students | | test | +--------------------+ 6 rows in set (0.00 sec)
此时,在mysql
的数据目录中,classes
目录也就被删除了
创建表,有很多的选项参数,是相当复杂的,因此一定要看懂创建表的帮助信息,得鱼
容易得渔
难
查看创建表的帮助:
创建表具体有三种方法,每个方法下都很很多很多得选项参数
当工作在非常大的表上时,你可能偶尔需要运行很多查询获得一个大量数据的小的子集,不是对整个表运行这些查询,而是让MySQL每次找出所需的少数记录,将记录选择到一个临时表可能更快些,然后在这些表运行查询。
mysql> HELP CREATE TABLE Name: 'CREATE TABLE' Description: Syntax: CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name (create_definition,...) [table_options] [partition_options] //方法一:格式: CREATE 表示要执行创建命令; [IF NOT EXISTS] 表示当要创建的表不存在时,才进行创建; tbl_name 表示创建的表的名字 [(create_definition)]表示对表中的列名,包括列属性,具体属性有:列名称,列存储的数据的数据类型,约束有:存储引擎,最大存放字数,是否使用自增长函数以及是否为主键、是否为唯一键; CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] [table_options] [partition_options] [IGNORE | REPLACE] [AS] query_expression //方法二:格式: CREATE 表示要执行创建命令; [IF NOT EXISTS] 表示当要创建的表不存在时,才进行创建; tbl_name 表示创建的表的名字 {} CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name { LIKE old_tbl_name | (LIKE old_tbl_name) } //方法三:格式: CREATE 表示要执行创建命令; [TEMPORARY]表示是创建临时表 ; [IF NOT EXISTS] 表示当要创建的表不存在时,才进行创建; tbl_name 表示创建的表的名字 {} 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) 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] data_type: //字段类型,就这么多,哈哈 BIT[(length)] | TINYINT[(length)] [UNSIGNED] [ZEROFILL] //微整型 | SMALLINT[(length)] [UNSIGNED] [ZEROFILL]//短整型 | MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL]//中整型 | INT[(length)] [UNSIGNED] [ZEROFILL]//整型 | INTEGER[(length)] [UNSIGNED] [ZEROFILL]//也是整型 | BIGINT[(length)] [UNSIGNED] [ZEROFILL]//长整型 | REAL[(length,decimals)] [UNSIGNED] [ZEROFILL]//实数型 | DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL]//双精度浮点型 | FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL]//浮点型 | DECIMAL[(length[,decimals])] [UNSIGNED] [ZEROFILL] | NUMERIC[(length[,decimals])] [UNSIGNED] [ZEROFILL] | DATE | TIME | TIMESTAMP | DATETIME | YEAR//都是时间类型 | CHAR[(length)]//CHAR型 [CHARACTER SET charset_name] [COLLATE collation_name] | VARCHAR(length) [CHARACTER SET charset_name] [COLLATE collation_name] | BINARY[(length)] | VARBINARY(length) | TINYBLOB | BLOB[(length)] | MEDIUMBLOB | LONGBLOB | TINYTEXT [CHARACTER SET charset_name] [COLLATE collation_name] | TEXT[(length)] [CHARACTER SET charset_name] [COLLATE collation_name] | MEDIUMTEXT [CHARACTER SET charset_name] [COLLATE collation_name] | LONGTEXT [CHARACTER SET charset_name] [COLLATE collation_name] | ENUM(value1,value2,value3,...) [CHARACTER SET charset_name] [COLLATE collation_name] | SET(value1,value2,value3,...) [CHARACTER SET charset_name] [COLLATE collation_name] | spatial_type index_col_name: col_name [(length)] [ASC | DESC] index_type: USING {BTREE | HASH} index_option: KEY_BLOCK_SIZE [=] value | index_type | WITH PARSER parser_name | COMMENT 'string' reference_definition: REFERENCES tbl_name (index_col_name,...) [MATCH FULL | MATCH PARTIAL | MATCH SIMPLE] [ON DELETE reference_option] [ON UPDATE reference_option] reference_option: RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT table_options: table_option [[,] table_option] ... table_option: AUTO_INCREMENT [=] value | AVG_ROW_LENGTH [=] value | [DEFAULT] CHARACTER SET [=] charset_name | CHECKSUM [=] {0 | 1} | [DEFAULT] COLLATE [=] collation_name | COMMENT [=] 'string' | CONNECTION [=] 'connect_string' | {DATA|INDEX} DIRECTORY [=] 'absolute path to directory' | DELAY_KEY_WRITE [=] {0 | 1} | ENGINE [=] engine_name | INSERT_METHOD [=] { NO | FIRST | LAST } | KEY_BLOCK_SIZE [=] value | MAX_ROWS [=] value | MIN_ROWS [=] value | PACK_KEYS [=] {0 | 1 | DEFAULT} | PASSWORD [=] 'string' | ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT} | TABLESPACE tablespace_name [STORAGE {DISK|MEMORY|DEFAULT}] | UNION [=] (tbl_name[,tbl_name]...) partition_options: PARTITION BY { [LINEAR] HASH(expr) | [LINEAR] KEY [ALGORITHM={1|2}] (column_list) | RANGE{(expr) | COLUMNS(column_list)} | LIST{(expr) | COLUMNS(column_list)} } [PARTITIONS num] [SUBPARTITION BY { [LINEAR] HASH(expr) | [LINEAR] KEY [ALGORITHM={1|2}] (column_list) } [SUBPARTITIONS num] ] [(partition_definition [, partition_definition] ...)] partition_definition: PARTITION partition_name [VALUES {LESS THAN {(expr | value_list) | MAXVALUE} | IN (value_list)}] [[STORAGE] ENGINE [=] engine_name] [COMMENT [=] 'string' ] [DATA DIRECTORY [=] 'data_dir'] [INDEX DIRECTORY [=] 'index_dir'] [MAX_ROWS [=] max_number_of_rows] [MIN_ROWS [=] min_number_of_rows] [TABLESPACE [=] tablespace_name] [NODEGROUP [=] node_group_id] [(subpartition_definition [, subpartition_definition] ...)] subpartition_definition: SUBPARTITION logical_name [[STORAGE] ENGINE [=] engine_name] [COMMENT [=] 'string' ] [DATA DIRECTORY [=] 'data_dir'] [INDEX DIRECTORY [=] 'index_dir'] [MAX_ROWS [=] max_number_of_rows] [MIN_ROWS [=] min_number_of_rows] [TABLESPACE [=] tablespace_name] [NODEGROUP [=] node_group_id] query_expression: SELECT ... (Some valid select or union statement)
1,在clasees
库中创建courses
表,包含一个cid
,一个subject
,一个level
mysql> CREATE TABLE courses(cid TINYINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,subject VARCHAR(30) NOT NULL,level ENUM('学位课','非学位课') NOT NULL) ENGINE=InnoDB; Query OK, 0 rows affected (0.18 sec) //courses中,创建了三列; //第一列:列名为cid,TINYINT UNSIGNED表示字段类型是无符号微整型,NOT NULL表示不可为空,AUTO_INCREMENT表示自增长,PRIMARY KEY 表示该列为主键; //第二列:列名为subject,VARCHAR(30)表示存储字段类型为varchar类型,占30字节;NOT NULL表示不可为空 //第三列:列名为level,ENUM('学位课','非学位课')表示为枚举类型,可填只有"学位课"或"非学位课",NOT NULL 表示不可为空 ENGINE=InnoDB 表示存储引擎使用InnoDB mysql> SHOW TABLES; +-------------------+ | Tables_in_classes | +-------------------+ | courses | +-------------------+ 1 row in set (0.01 sec)
当创建好表之后,就可以在表中插入数据了。查看插入数据的帮助:
mysql> HELP INSERT Name: 'INSERT' Description: Syntax: INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [(col_name [, col_name] ...)] {VALUES | VALUE} (value_list) [, (value_list)] ... [ON DUPLICATE KEY UPDATE assignment_list] //INSERT 表示要号子型插入命令; [LOW_PRIORITY | DELAYED | HIGH_PRIORITY]是表示插入数据的级别; [IGNORE]表示忽略; [INTO] 关键字表示插入; tbl_name 表示插入的表的名字; [(col_name [, col_name] ...)] 表示表中的列名,可以是很多列; {VALUES | VALUE} (value_list) [, (value_list)] VALUE关键字是表示插入的具体数据,后面()中填写具体数据 INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name SET assignment_list [ON DUPLICATE KEY UPDATE assignment_list] INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [(col_name [, col_name] ...)] SELECT ... [ON DUPLICATE KEY UPDATE assignment_list] value: {expr | DEFAULT} value_list: value [, value] ... assignment: col_name = value assignment_list: assignment [, assignment] ...
1,给courses
插入数据
mysql> INSERT INTO courses (subject,level) VALUES('密码学基础','学位课'),('走进 通信','非学位课'),('JAVA编程','非学位课'); Query OK, 3 rows affected (0.41 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM courses; +-----+-----------------+--------------+ | cid | subject | level | +-----+-----------------+--------------+ | 1 | 密码学基础 | 学位课 | | 2 | 走进通信 | 非学位课 | | 3 | JAVA编程 | 非学位课 | +-----+-----------------+--------------+ 3 rows in set (0.00 sec)
第二中创建表的方式的核心思想:仿照已经存在的表,创建一个新表,但是某些属性并没有继承母表
mysql> CREATE TABLE courses_2 SELECT * FROM courses WHERE cid <= 2; Query OK, 2 rows affected (0.44 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM courses; +-----+-----------------+--------------+ | cid | subject | level | +-----+-----------------+--------------+ | 1 | 密码学基础 | 学位课 | | 2 | 走进通信 | 非学位课 | | 3 | JAVA编程 | 非学位课 | +-----+-----------------+--------------+ 3 rows in set (0.00 sec) mysql> select * from courses_2; +-----+-----------------+--------------+ | cid | subject | level | +-----+-----------------+--------------+ | 1 | 密码学基础 | 学位课 | | 2 | 走进通信 | 非学位课 | +-----+-----------------+--------------+ 2 rows in set (0.00 sec) mysql> desc courses; +---------+----------------------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------+----------------------------------+------+-----+---------+----------------+ | cid | tinyint(3) unsigned | NO | PRI | NULL | auto_increment | | subject | varchar(30) | NO | | NULL | | | level | enum('学位课','非学位课') | NO | | NULL | | +---------+----------------------------------+------+-----+---------+----------------+ 3 rows in set (0.09 sec) mysql> desc courses_2; +---------+----------------------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+----------------------------------+------+-----+---------+-------+ | cid | tinyint(3) unsigned | NO | | 0 | | | subject | varchar(30) | NO | | NULL | | | level | enum('学位课','非学位课') | NO | | NULL | | +---------+----------------------------------+------+-----+---------+-------+ 3 rows in set (0.01 sec)
注意:这种方式创建新的表,并没有继承母表的属性。
第三种方式创建表的核心思想:完全仿照母表,创建一个新的表,继承的是母表的属性,但是不继承目标的数据
mysql> CREATE TABLE courses_3 LIKE courses; Query OK, 0 rows affected (0.13 sec) mysql> SELECT * FROM courses_3; Empty set (0.00 sec) mysql> DESC courses_3; +---------+----------------------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------+----------------------------------+------+-----+---------+----------------+ | cid | tinyint(3) unsigned | NO | PRI | NULL | auto_increment | | subject | varchar(30) | NO | | NULL | | | level | enum('学位课','非学位课') | NO | | NULL | | +---------+----------------------------------+------+-----+---------+----------------+ 3 rows in set (0.00 sec)
可以看到,继承了母表所有的属性,但是是一个空表
创建表总结:根据不同需求去创建不同的表,三种方式个有千秋,但是最主要的还是掌握如何使用HELP
命令去查看怎么创建表
所谓修改表,就是对已经存在的表的二次操作;修改表就是对表中的字段、索引、甚至索引进行添加、删除、修改等
查看修改表的帮助:
mysql> HELP ALTER TABLE Name: 'ALTER TABLE' Description: Syntax: ALTER [ONLINE|OFFLINE] [IGNORE] TABLE tbl_name [alter_specification [, alter_specification] ...] [partition_options] //格式:ALTER 表示进行修改的操作; [ONLINE|OFFLINE] 表示在线还是离线修改; [IGNORE] 忽略; TABLE 表示要对一个表进行修改操作; tabl_name 表示操作的表名; [alter_specification [, alter_specification] ...] 表示一些修改的选项,如ADD(进行添加操作),CHANGE(进行修改操作),DROP(进行删除操作); //使用HELP ALERT TABLE 命令下面还有很多对选项参数的使用方法,这里就不一一罗列,自己掌握常用的即可
1,给classes
表添加一个字段,为开课时间time_start
mysql> ALTER TABLE courses ADD (time_start TIME NOT NULL); Query OK, 3 rows affected (0.27 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM courses; +-----+-----------------+--------------+------------+ | cid | subject | level | time_start | +-----+-----------------+--------------+------------+ | 1 | 密码学基础 | 学位课 | 00:00:00 | | 2 | 走进通信 | 非学位课 | 00:00:00 | | 3 | JAVA编程 | 非学位课 | 00:00:00 | +-----+-----------------+--------------+------------+ 3 rows in set (0.00 sec)
已经添加成功了time_start
字段,如何添加数据呢?这里可以和修改密码的方式一样,进行更新数据
mysql> UPDATE courses SET time_start='08:00:00' WHERE cid=1; Query OK, 1 row affected (0.15 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> SELECT * FROM courses; +-----+-----------------+--------------+------------+ | cid | subject | level | time_start | +-----+-----------------+--------------+------------+ | 1 | 密码学基础 | 学位课 | 08:00:00 | | 2 | 走进通信 | 非学位课 | 00:00:00 | | 3 | JAVA编程 | 非学位课 | 00:00:00 | +-----+-----------------+--------------+------------+ 3 rows in set (0.00 sec) //同样,可以修改每一门课的上课时间 mysql> UPDATE courses SET time_start='10:15:00' WHERE cid=2; Query OK, 1 row affected (0.08 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> UPDATE courses SET time_start='16:45:00' WHERE cid=3; Query OK, 1 row affected (0.15 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> SELECT * FROM courses; +-----+-----------------+--------------+------------+ | cid | subject | level | time_start | +-----+-----------------+--------------+------------+ | 1 | 密码学基础 | 学位课 | 08:00:00 | | 2 | 走进通信 | 非学位课 | 10:15:00 | | 3 | JAVA编程 | 非学位课 | 16:45:00 | +-----+-----------------+--------------+------------+ 3 rows in set (0.00 sec)
2,修改courses
表中,time_start
为time_start
,并且属性为NOT NULL TIMESTAMP
mysql> ALTER TABLE courses CHANGE time_start time_start TIMESTAMP NOT NULL; Query OK, 3 rows affected, 3 warnings (0.27 sec) Records: 3 Duplicates: 0 Warnings: 3 mysql> SELECT * FROM courses; +-----+-----------------+--------------+---------------------+ | cid | subject | level | time_start | +-----+-----------------+--------------+---------------------+ | 1 | 密码学基础 | 学位课 | 0000-00-00 00:00:00 | | 2 | 走进通信 | 非学位课 | 0000-00-00 00:00:00 | | 3 | JAVA编程 | 非学位课 | 0000-00-00 00:00:00 | +-----+-----------------+--------------+---------------------+ 3 rows in set (0.00 sec) //注意,如果修改了属性。原本的数据就会消失,所以这也是个很操心的动作。所以,演示完成后,经过一番操作,我又把数据改了回去; mysql> SELECT * FROM courses; +-----+-----------------+--------------+------------+ | cid | subject | level | time_start | +-----+-----------------+--------------+------------+ | 1 | 密码学基础 | 学位课 | 08:00:00 | | 2 | 走进通信 | 非学位课 | 10:15:00 | | 3 | JAVA编程 | 非学位课 | 16:45:00 | +-----+-----------------+--------------+------------+ 3 rows in set (0.00 sec)
3,删除courses
表中的time_start
字段
注意:这里说的删除,是删除表中的字段、索引等,不是说删除表!!!所以还是属于对表的ALTER
操作
mysql> ALTER TABLE courses DROP time_start; Query OK, 3 rows affected (0.28 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM courses; +-----+-----------------+--------------+ | cid | subject | level | +-----+-----------------+--------------+ | 1 | 密码学基础 | 学位课 | | 2 | 走进通信 | 非学位课 | | 3 | JAVA编程 | 非学位课 | +-----+-----------------+--------------+ 3 rows in set (0.00 sec)
辛辛苦苦创建,轻轻松松删除,还是那句话,数据最珍贵,尽量不要去DROP
删除十个很危险的动作,特别是在数据库上。不是十分把握,还是不要删除,想想rm -rf
的动作多危险,这个动作就有多危险。
查看删除表的帮助:
mysql> HELP DROP TABLE Name: 'DROP TABLE' Description: Syntax: DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ... [RESTRICT | CASCADE] //格式: DROP 关键字表示要执行删除操作; [TEMPORARY] 表示临时操作; TABLE 表示要对表进行该操作; tbl_name 表示表的名字,具体到操作哪个表; [RESTRICT | CASCADE] 这是两个关键字,RESTRICT表示检查外键约束,CASCADE表示连同约束外键的表也进行DROP操作;CASCADE这个关键字更加危险,还是不要用,简直就是株连九族
1,删除classes_2
和classes_3
表
mysql> DROP TABLE courses_2 -> ; Query OK, 0 rows affected (0.11 sec) mysql> DROP TABLE courses_3; Query OK, 0 rows affected (0.10 sec) mysql> SHOW TABLES; +-------------------+ | Tables_in_classes | +-------------------+ | courses | +-------------------+ 1 row in set (0.00 sec)
数据库索引用来提高数据库表的数据访问速度。索引不能被修改,只能创建,删除,或者查看,索引本身是一个结构体实例化
注意:如果要修改索引,那就是两段式了,先删除再创建就可以达到修改索引的效果
一个表中某一个字段,可以创建多个索引
查看创建索引的帮助:
mysql> HELP CREATE INDEX Name: 'CREATE INDEX' Description: Syntax: CREATE [ONLINE|OFFLINE] [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [index_type] ON tbl_name (index_col_name,...) [index_option] ... //格式:CREATE 表示进行创建操作; [ONLINE|OFFLINE] 表示在线或者离线操作; [UNIQUE|FULLTEXT|SPATIAL] 表示创建的索引类型,分别表示唯一索引、全文索引、空间索引三种不同的索引类型; index_name 表示索引的名称,由用户自行定义,以便于以后对该索引进行修改等管理操作; [index_type] 表示索引的具体实现方式,在MySQL中,有两种不同形式的索引——BTREE索引和HASH索引,而存储引擎为MyISAM和InnoDB的表中只能使用BTREE,其默认值就是BTREE,存储引擎为MEMORY或者HEAP的表中可以使用HASH和BTREE两种类型的索引,其默认值为HASH;ON tbl_name (index_col_name,...) 表示在哪个表上进行创建索引,index_col_name 表示需要创建索引的字段名称,可以针对多个字段创建复合索引,只需要在多个字段名称之间以英文逗号隔开即可 index_col_name: col_name [(length)] [ASC | DESC] index_option: KEY_BLOCK_SIZE [=] value | index_type | WITH PARSER parser_name | COMMENT 'string' index_type: USING {BTREE | HASH}
mysql> SHOW INDEXES FROM courses\G *************************** 1. row *************************** Table: courses Non_unique: 0 Key_name: PRIMARY Seq_in_index: 1 Column_name: cid Collation: A Cardinality: 3 Sub_part: NULL Packed: NULL Null: Index_type: BTREE Comment: Index_comment: 1 row in set (0.00 sec) //在创建索引之前,查看courses表的索引信息
1,为courses
表的subject
字段创建索引
mysql> CREATE INDEX sub_index ON courses (subject) USING BTREE; Query OK, 0 rows affected (0.56 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> SHOW INDEXES FROM courses\G *************************** 1. row *************************** Table: courses Non_unique: 0 Key_name: PRIMARY Seq_in_index: 1 Column_name: cid Collation: A Cardinality: 3 Sub_part: NULL Packed: NULL Null: Index_type: BTREE Comment: Index_comment: *************************** 2. row *************************** Table: courses Non_unique: 1 Key_name: sub_index Seq_in_index: 1 Column_name: subject Collation: A Cardinality: 3 Sub_part: NULL Packed: NULL Null: Index_type: BTREE Comment: Index_comment: 2 rows in set (0.00 sec) //此时可以看到,成功的为subject字段创建了一个新的索引。Key_name为sub_index
查看删除索引的帮助:
mysql> HELP DROP INDEX Name: 'DROP INDEX' Description: Syntax: DROP [ONLINE|OFFLINE] INDEX index_name ON tbl_name //格式: DROP 表示进行删除操作; [ONLINE|OFFLINE] 表示在线或者离线操作; INDEX 关键字表示对索引进行删除操作; index_name 表示要删除的索引的名字; ON tbl_name 表示删除的表的名字
1,删除courses
表中subject
字段的sub_index
索引
mysql> DROP INDEX sub_index ON courses; Query OK, 0 rows affected (0.17 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> SHOW INDEXES FROM courses\G *************************** 1. row *************************** Table: courses Non_unique: 0 Key_name: PRIMARY Seq_in_index: 1 Column_name: cid Collation: A Cardinality: 3 Sub_part: NULL Packed: NULL Null: Index_type: BTREE Comment: Index_comment: 1 row in set (0.00 sec)
学习对mysql的库、表、索引的操作,一定要学会如何使用HELP
命令;操作有四种
增:CREATE
删:DROP
改:ALTER
查:SELECT
即最主要学会的是HELP CREATE|DRPO|ALTER|SELECT DATABSE|TABLE|INDEX
相关操作,然后通过HELP
得到的帮助进行具体操作。