Python-day(十二)-MySQL
一、数据库介绍
什么是数据库?
数据是按照数据结构组织、存储和管理数据的仓库
每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据。
我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。
所以,现在我们使用关系型数据库管理系统(RDBMS)来存储和管理的大数据量,所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
RDBMS即关系数据库的管理系统(Relational Databases Management System)的特点:
1、数据以表格的形式出现
2、每行为各种记录名称
3、每列为记录名称所对应的数据域
4、许多的行和列组成一张表单。
5、若干的表单组成database。
RDBMS 术语
在我们开始学习MySQL数据库前,让我们先了解下RDBMS的一些术语:
数据库:数据库是一些关联表的集合。
数据表:表示数据的矩阵,在一个数据库中的表看起来像一个简单的电子表格。
列:一列(数据元素)包含了相同的数据,例如邮政编码的数据。
行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
冗余:存储两倍说句,冗余可以使系统速度更快(表的规范化程度越高,表与表之间的关系就越多;查询时可能经常需要在多个表之间进行连接查询,而进行连接操作会降低查询速度,例如,学生的信息存储在student表中,院系信息存储在department表中,通过student表中的dept_id字段与department表建立关联关系。如果要查询一个学生所在系的名称,必须从student表中查询学生所在院系的编号(dept_id),然后根据这个编号去department查找系的名称,如果经常需要进行这个操作时,连接查询会浪费很多的时间,因此可以在student表中增加一个冗余字段dept_name,该字段用来存储学生所在院系的名称,这样就不用每次都进行连接操作了。)
主键:主键是唯一的,一个数据表中只能包含一个主键,你可以使用主键来查询数据
外键:外键用于关联两个表。
复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
索引:使用索引可快速访问数据库表中的特定信息,索引是对数据库表中一列或多列的值进行排序的一种结构,类似于书籍的目录。
参照完整性:参照的完整性要求关系中不允许引用不存在的实体,与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。
MySQL数据库
MySQL是最流行的关系型数据库管理系统,在web应用方面MySQL是最好的RDBMS应用软件之一,MySQL是一种关系型数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库中,这样就增加了速度并提高了灵活性。
MySQL是开源的,所以你不需要支付额外的费用。
MySQL支持大型的数据库,可以处理拥有上千万条记录的大型数据库。
MySQL使用标准的SQL数据语言形式。
MySQL可以允许于多个系统上,并且支持多种语言,这些编程语言包括C、C++、Python、java、perl、PHP、eiffel、ruby和tcl等。
MySQL对PHP有很好的支持,PHP是目前最流行的web开发语言。
MySQL支持大型数据库,支持5000万条记录的数据仓库。32位系统表文件最大可支持4GB,64为操作系统最大的表文件为8TB。
MySQL是可以定制,采用了GPL协议,你可以修改源码来开发自己的MySQL系统。
二、MySQL数据的安装使用
Linux/Unix上安装MySQL
Linux平台上推荐使用rpm包来安装MySQL,MySQL AB提供了以下RPM包的下载地址。
MySQL-MySQL服务器。你需要该选项,除非你只想连接运行在另一台机器上的MySQL的服务器。
MySQL-client MySQL客户端程序,用于连接并操作MySQL服务器。
mysql-devel-库和包含文件,如果你想要编译其它mysql客户端,例如perl模块,则需要安装该RPM包。
MySQL-shared-该软件包包含某些语言和应用程序需要动态状态的共享库(libmysqlclient.so*),使用MySQL。
MySQL-bench-MySQL数据库服务器的基准和性能测试工具。
以下安装MySQL RMP的实例是在SuSE Linux系统上进行,当然该安装步骤也适合应用于其他支持RPM的Linux系统,如:CentOS。
2.1 MySQL简单操作
通过以下命令执行Mysql安装,rpm包为你下载的rpm包: [root@host]# rpm -i MySQL-5.0.9-0.i386.rpm 以上安装mysql服务器的过程会创建mysql用户,并创建一个mysql配置文件my.cnf。 你可以在/usr/bin和/usr/sbin中找到所有与MySQL相关的二进制文件。所有数据表和数据库将在/var/lib/mysql目录中创建。 以下是一些mysql可选包的安装过程,你可以根据自己的需要来安装: [root@host]# rpm -i MySQL-client-5.0.9-0.i386.rpm [root@host]# rpm -i MySQL-devel-5.0.9-0.i386.rpm [root@host]# rpm -i MySQL-shared-5.0.9-0.i386.rpm [root@host]# rpm -i MySQL-bench-5.0.9-0.i386.rpm
使用 MySQL Client(Mysql客户端) 执行简单的SQL命令
你可以在 MySQL Client(Mysql客户端) 使用 mysql 命令连接到Mysql服务器上,默认情况下Mysql服务器的密码为空,所以本实例不需要输入密码。
命令如下:
[root@host]# mysql 以上命令执行后会输出 mysql>提示符,这说明你已经成功连接到Mysql服务器上,你可以在 mysql> 提示符执行SQL命令: mysql> SHOW DATABASES; +----------+ | Database | +----------+ | mysql | | test | +----------+ 2 rows in set (0.13 sec) Mysql安装后需要做的 Mysql安装成功后,默认的root用户密码为空,你可以使用以下命令来创建root用户的密码: [root@host]# mysqladmin -u root password "new_password"; 现在你可以通过以下命令来连接到Mysql服务器: [root@host]# mysql -u root -p Enter password:******* 注意:在输入密码时,密码是不会显示了,你正确输入即可。 Linux系统启动时启动 MySQL 如果你需要在Linux系统启动时启动 MySQL 服务器,你需要在 /etc/rc.local 文件中添加以下命令: /etc/init.d/mysqld start 同样,你需要将 mysqld 二进制文件添加到 /etc/init.d/ 目录中。
三、MySQL管理
3.1 启动及关闭MySQL服务器
首先,我们需要通过以下命令来检查MySQL服务器是否启动: ps -ef | grep mysqld 如果MySql已经启动,以上命令将输出mysql进程列表, 如果mysql未启动,你可以使用以下命令来启动mysql服务器: root@host# cd /usr/bin ./mysqld_safe & 如果你想关闭目前运行的 MySQL 服务器, 你可以执行以下命令: root@host# cd /usr/bin ./mysqladmin -u root -p shutdown Enter password: ******
3.2 MySQL用户设置
如果你需要添加 MySQL 用户,你只需要在 mysql 数据库中的 user 表添加新用户即可。 以下为添加用户的的实例,用户名为guest,密码为guest123,并授权用户可进行 SELECT, INSERT 和 UPDATE操作权限: root@host# mysql -u root -p Enter password:******* mysql> use mysql; Database changed mysql> INSERT INTO user (host, user, password, select_priv, insert_priv, update_priv) VALUES ('localhost', 'guest', PASSWORD('guest123'), 'Y', 'Y', 'Y'); Query OK, 1 row affected (0.20 sec) mysql> FLUSH PRIVILEGES; Query OK, 1 row affected (0.01 sec) mysql> SELECT host, user, password FROM user WHERE user = 'guest'; +-----------+---------+------------------+ | host | user | password | +-----------+---------+------------------+ | localhost | guest | 6f8c114b58f2ce9e | +-----------+---------+------------------+ 1 row in set (0.00 sec) 在添加用户时,请注意使用MySQL提供的 PASSWORD() 函数来对密码进行加密。 你可以在以上实例看到用户密码加密后为: 6f8c114b58f2ce9e. 注意:在 MySQL5.7 中 user 表的 password 已换成了authentication_string。 注意:在注意需要执行 FLUSH PRIVILEGES 语句。 这个命令执行后会重新载入授权表。 如果你不使用该命令,你就无法使用新创建的用户来连接mysql服务器,除非你重启mysql服务器。 你可以在创建用户时,为用户指定权限,在对应的权限列中,在插入语句中设置为 'Y' 即可,用户权限列表如下: Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv,Reload_priv,Shutdown_priv,Process_priv,File_priv,Grant_priv,References_priv,Index_priv,Alter_priv 另外一种添加用户的方法为通过SQL的 GRANT 命令,你下命令会给指定数据库TUTORIALS添加用户 zara ,密码为 zara123 。 root@host# mysql -u root -p password; Enter password:******* mysql> use mysql; Database changed mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP -> ON TUTORIALS.* -> TO 'zara'@'localhost' -> IDENTIFIED BY 'zara123';
3.3 管理MySQL的命令
MySQL数据过程中常用的命令: use databasename:选择要操作的MySQL数据库,使用该命令后所有mysql命令都只针对该数据库。 show databases:查看数据库 show tables:查看数据表 show columns from 数据表:显示数据表的属性,属性类型,主键信息,是否为null,默认值等其他信息。 create database testdb charset "utf8":创建数据库 drop database testdb,删除数据库。 show index from 数据表:显示数据表的详细索引信息,包括主键(primary key) grant :用户授权 flush privileges:刷新权限。
3.4 MySQL数据类型
MySQL中定义数据字段的类型对你数据库的优化是非常重要。 MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。 数值类型 MySQL支持所有标准sql数值数据类型。 这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。 关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。 BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。 作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围。
3.5 mysql常用命令
MySQL创建数据表
语法 CREATE TABLE table_name (column_name column_type); 创建一个student表 mysql> create table student( -> id int not null auto_increment, -> name char(32) not null, -> age int not null, -> register_date date, -> primary key (id) -> ); 实例解析: 如果你不想字段NULL可以设置字段的属性为NOT NUll,在操作数据库时如果输入该字段的数据为NUll,就会报错。 AUTO_INCREMENT自定义列为自增的属性,一般用于主键,数值会自动加1. PRIMARY KEY 关键字用于定义列为主键,你可以使用多列来定义主键,列间以逗号分隔。
MySQL插入数据
语法: INSERT INTO table_name ( field1, field2,...fieldN ) VALUES ( value1, value2,...valueN ); 插入数据 insert into student (name,age,register_date) values ("陈鑫",22,"2016-02-03"); mysql> select * from student; +----+--------+-----+---------------+ | id | name | age | register_date | +----+--------+-----+---------------+ | 1 | 陈鑫 | 22 | 2016-02-03 | +----+--------+-----+---------------+ 1 row in set (0.00 sec)
MySQL查询数据
语法: SELECT column_name,column_name FROM table_name [WHERE Clause] [OFFSET M ][LIMIT N] 查询语句中你可以时候用一个或多个表,表之间使用逗号(,)分割,并使用where语句来设定查询条件。 select 命令可以读取一条或多条记录。 你可以使用星号(*)来代替其他字段,select语句会返回表的所有字段数据。 你可以通过offset指定select语句开始查询的数据偏移量,默认情况下偏移量为0. 你可以使用limit属性来设定返回的记录数。 查询数据 mysql> select * from student limit 3 offset 2; +----+-----------+-----+---------------+ | id | name | age | register_date | +----+-----------+-----+---------------+ | 3 | 刘强 | 53 | 2016-04-30 | | 4 | 白弘毅 | 31 | 2016-11-21 | | 5 | 汤中山 | 21 | 2016-12-20 | +----+-----------+-----+---------------+ 3 rows in set (0.00 sec) #从第二行开始向下查询3条数据,limit后面跟的是3条数据,offset后面是从第2行开始读取。 mysql> select * from student limit 3,1; +----+-----------+-----+---------------+ | id | name | age | register_date | +----+-----------+-----+---------------+ | 4 | 白弘毅 | 31 | 2016-11-21 | +----+-----------+-----+---------------+ 1 row in set (0.00 sec) #这个sql是,limit后面是从第3条开始读,读取1条信息。
MySQL where 子句
语法: SELECT field1, field2,...fieldN FROM table_name1, table_name2... [WHERE condition1 [AND [OR]] condition2..... 以下为操作符列表,可用于where子句中 下表中实例假定 A为10 B为20 操作符 描述 实例 = 等号,检测两个值是否相等,如果相等返回true (A = B) 返回false。 <>,!= 不等于,检测两个值是否相等,如果不相等返回true (A != B) 返回 true。 > 大于号,检测左边的值是否大于右边的值, 如果左边的值大于右边的值返回true (A > B) 返回false。 < 小于号,检测左边的值是否小于右边的值, 如果左边的值小于右边的值返回true (A < B) 返回 true。 >= 大于等于号,检测左边的值是否大于或等于右边的值, 如果左边的值大于或等于右边的值返回true (A >= B) 返回false。 <= 小于等于号,检测左边的值是否小于于或等于右边的值, 如果左边的值小于或等于右边的值返回true (A <= B) 返回 true。 使用主键来作为 where 子句的条件查询是非常快速的。 mysql> select * from student where register_date >"2016-08-31";
MySQL update 语句
语法: UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE Clause] update student set age=22,name=="chenxin" where id =1;
MySQL delete语句
语法: DELETE FROM table_name [WHERE Clause] delete from student where id=5;
MySQL like 子句
语法: SELECT field1, field2,...fieldN table_name1, table_name2... WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue' select * from student where name like "%Li";#不区分大小写匹配 select * from student where name like binary "%li";#区分大小写匹配
MySQL排序
语法: SELECT field1, field2,...fieldN table_name1, table_name2... ORDER BY field1, [field2...] [ASC [DESC]] 使用ASC或DESC关键字来设置查询结果是按升序或降序排列,默认情况下,它是按升序排序。 select * from student where name like binary "%li" order by id desc; #desc是降序排序,按照id进行排序 select * from student where name like "%li" order by id;#默认按照升序排序。
MySQL group by 语句
SELECT column_name, function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name; mysql> select * from student; +----+-----------+-----+---------------+ | id | name | age | register_date | +----+-----------+-----+---------------+ | 1 | chenxin | 22 | 2016-02-03 | | 2 | 沁夫 | 33 | 2016-06-08 | | 3 | 刘强 | 53 | 2016-04-30 | | 4 | 白弘毅 | 31 | 2016-11-21 | | 6 | alex li | 18 | 2016-11-11 | | 7 | alex Li | 33 | 2015-11-11 | +----+-----------+-----+---------------+ 6 rows in set (0.01 sec) 接下来我们使用 group by 语句,将数据表按名字进行分组,并统计每个人有多少条记录; mysql> select name,count(*) from student group by name; +-----------+----------+ | name | count(*) | +-----------+----------+ | alex li | 2 | | chenxin | 1 | | 白弘毅 | 1 | | 刘强 | 1 | | 沁夫 | 1 | +-----------+----------+ 5 rows in set (0.00 sec) 使用with rollup,#将相同name的条数的年龄相加起来,在求和。 mysql> select name,sum(age)as age_count from student group by name with rollup; +-----------+-----------+ | name | age_count | +-----------+-----------+ | alex li | 51 | | chenxin | 22 | | 白弘毅 | 31 | | 刘强 | 53 | | 沁夫 | 33 | | NULL | 190 | +-----------+-----------+ 6 rows in set (0.00 sec) 其中记录NULL表示所有人的年龄之和。 我们是使用coalesce来设置一个取代null的名称,coalesce语法: mysql> select coalesce(name,'总数'),sum(age) as age_count from student group by name with rollup; +-------------------------+-----------+ | coalesce(name,'总数') | age_count | +-------------------------+-----------+ | alex li | 51 | | chenxin | 22 | | 白弘毅 | 31 | | 刘强 | 53 | | 沁夫 | 33 | | 总数 | 190 | +-------------------------+-----------+ 6 rows in set (0.00 sec)
MySQL alter 命令
我们需要修改数据库表名或者修改数据表字段时,就需要使用到MySQL alter命令。 删除,添加或修改表字段 alter table student drop register_date; #从student表删除register_date字段。 alter table student add phone int(11) not null; #在student表中添加phone字段。 修改字段类型及名称 如果需要修改字段类型及名称,你可以在alter命令中使用modify或change子句。 例如,把字段name的类型从char(32)改为char(40),命令为: alter table student modify name char(40); 使用change子句,语法有很大不一样,在change关键字之后,紧跟着的是你要修改的字段名,然后指定新字段名及类型,尝试如下实例。 alter table student change phone iphone bigint;#修改名字并改变字段类型 alter table student change iphone iphone int;#只修改字段类型,但必须要加修改的名字和修改成的名字。 alter table 对NUll值和默认值的影响 当你修改字段时,你可以指定是否包含只或者是否设置默认值。 以下实例,指定字段iphone为not null 且默认值为100 alter table student modify iphone bigint not null default 100; #注意:这里修改的默认值是在此以后新添加的会有默认值,之前的数据是不会修改的。 修改表名 alter table student rename to alter_tb1;
MySQL关于主键
外键,一个特殊的索引,用于关键2个表,只能是指定的内容。 mysql> create table class( -> id int not null primary key, -> name char(16)); Query OK, 0 rows affected (0.00 sec) mysql> create table student2( -> id int not null, -> name char(16) not null, -> class_id int not null, -> primary key (id), -> key fk_class_key (class_id), -> constraint fk_class_key foreign key (class_id) references class (id) -> ); Query OK, 0 rows affected (0.00 sec) 此时如果class表中不存在id 1,student表也插入不了,这就叫外键约束。 mysql> insert into student2(id,name,class_id) values(1,'alex', 1); ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`testdb`.`student2`, CONSTRAINT `fk_class_key` FOREIGN KEY (`class_id`) REFERENCES `class` (`id`)) mysql> insert into class(id,name) values(1,"linux"); Query OK, 1 row affected (0.01 sec) mysql> insert into student2(id,name,class_id) values(1,'alex', 1); Query OK, 1 row affected (0.00 sec) #如果有student表中跟这个class表有关联的数据,你是不能删除class表中与其关联的纪录的 mysql> delete from class where id =1; ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`testdb`.`student2`, CONSTRAINT `fk_class_key` FOREIGN KEY (`class_id`) REFERENCES `class` (`id`))
MySQL NUll 值处理
我们已经知道MySQL使用sql select命令及where子句来读取数据表中的数据,但是当提供的查询条件字段为NUll时,该命令可能就无法正常工作。 为了处理这种情况,MySQL提供了三大运算符: is null:当列的值是null,此运算符返回true。 is not null:当列的值不为null,运算符返回true。 <=>:比较操作符(不同于=运算符),当比较的两个值为null时返回true。 关于null的条件比较运算是比较特殊的,你不能使用=null或!=null在列中查找null值。 在mysql中,null值与任何其它值的比较(即使是null)永远返回false,即null=null返回false。 MySQL中处理null使用is null和is not null运算符。
MySQL 连接(left join ,right join,inner join,full join)
我们已经学会了如果在一张表中读取数据,这是相对简单的,但是真正的应用中经常需要从多张数据表中读取数据。
本章节我们将向大家介绍如何使用MySQL和join在两个或多个表中查询数据。
你可以在select ,update,和delete语句中使用MySQL的join来联合多表查询。
join按照功能大致分为如下 三类:
INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
RIGHT JOIN(右连接):与LEFT JOIN相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
四、事务
MySQL事务主要用于处理操作量大,复杂度高的数据,比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如邮箱,文章等,这样,这些数据库操作语句就构成一个事务。
在MySQL中只有使用了Innodb数据库引擎的数据库或表才支持事务。
事务处理可以用来维护数据库的完整性,保证成批的sql语句要么全部执行,要么全部不执行。
事务用来管理insert,update,dalete语句。
一般来说,事务是必须满足4个条件(ACID):Atomicity(原子性)、Consistency(稳定性)、Isolation(隔离性)、Durability(可靠性)
1、事务的原子性:一组事务,要么成功,要么撤回。
2、稳定性:有非法数据(外键约束之类),事务撤回
3、隔离性:事务独立运行,一个事务处理后的结果,影响了其他事务,那么其他事务会撤回,事务的100%隔离,需要牺牲速度。
4、可靠性:软、硬件崩溃后,Innodb数据表驱动会利用日志文件重构修改,可靠性和高速度不可兼得,innodb_flush_log_at_trx_commit选项,决定什么时候把事务保存到日志里。
在MySQL控制台使用事务操作
完成一个事务 mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> select * from A; Empty set (0.00 sec) mysql> insert into A (id) values(1); Query OK, 1 row affected (0.00 sec) mysql> select * from A; +----+ | id | +----+ | 1 | +----+ 1 row in set (0.00 sec) mysql> commit; Query OK, 0 rows affected (0.00 sec) 回滚一个事务 mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> select * from A; +----+ | id | +----+ | 1 | +----+ 1 row in set (0.00 sec) mysql> insert into A(id)values(2); Query OK, 1 row affected (0.00 sec) mysql> rollback; Query OK, 0 rows affected (0.00 sec) mysql> select * from A; +----+ | id | +----+ | 1 | +----+ 1 row in set (0.00 sec) 备注: 如果发现不能回滚,处理如下: 1、首先查看数据的存储引擎 mysql> show engines; +------------+---------+------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +------------+---------+------------------------------------------------------------+--------------+------+------------+ | MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO | | CSV | YES | CSV storage engine | NO | NO | NO | | MyISAM | DEFAULT | Default engine as of MySQL 3.23 with great performance | NO | NO | NO | | InnoDB | YES | Supports transactions, row-level locking, and foreign keys | YES | YES | YES | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO | +------------+---------+------------------------------------------------------------+--------------+------+------------+ 5 rows in set (0.00 sec) 2、查看表使用的存储引擎 (1) show table status from db_name where name="table_name"; (2) show create table table_name; 3、修改表引擎方法 altar table table_name engine=innodb; 4、永久生效,修改配置文件 default-storage-engine=INNODB
五、索引
MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。
打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车
索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以由多个单列索引,但这不是组合索引,组合索引,即一个索引包含多个列。
创建索引时,你需要确保该索引是应用在sql查询语句的条件(一般作为where子句的条件)
实际上,索引也是一张表,该表保证了主键与索引字段,并指向实体表的记录。
上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行insert、update、delete,因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件,建立索引会占用磁盘空间索引文件。
1、普通索引
创建索引 这是最基本的索引,它没有任何限制,他有以下几种创建方式: mysql> create index index_name on student(name); mysql> desc student; +--------+------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------+------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | char(40) | YES | MUL | NULL | | | age | int(11) | NO | | NULL | | | iphone | bigint(20) | NO | | 100 | | +--------+------------+------+-----+---------+----------------+ 4 rows in set (0.00 sec) 如果是char、varchar类型,length可以小于字段实际长度,如果是blog和text类型,必须制定length(长度)。 修改表结构 ALTER mytable ADD INDEX [indexName] ON (username(length)) 创建表的时候直接指定 CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, INDEX [indexName] (username(length)) ); 删除索引的语法 DROP INDEX [indexName] ON mytable;
2、唯一索引
它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值,如果是组合索引,则列值的组合必须唯一,他有以下几种创建方法:
创建索引 创建索引 CREATE UNIQUE INDEX indexName ON mytable(username(length)) 修改表结构 ALTER mytable ADD UNIQUE [indexName] ON (username(length)) 创建表的时候直接指定 CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, UNIQUE [indexName] (username(length)) );
使用alter命令添加和删除索引
有四种方式来添加数据表的索引: ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。 ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。 ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出现多次。 ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):该语句指定了索引为 FULLTEXT ,用于全文索引。 以下实例为在表中添加索引。 mysql> ALTER TABLE testalter_tbl ADD INDEX (c); 你还可以在 ALTER 命令中使用 DROP 子句来删除索引。尝试以下实例删除索引: mysql> ALTER TABLE testalter_tbl DROP INDEX (c); 使用alter命令添加和删除主键 主键只能作用于一个列上,添加主键索引时,你需要确保该主键默认不为空(NOT NULL)。实例如下: mysql> ALTER TABLE testalter_tbl MODIFY i INT NOT NULL; mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (i); 你也可以使用 ALTER 命令删除主键: mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY; 删除指定时只需指定PRIMARY KEY,但在删除索引时,你必须知道索引名。 显示索引信息 SHOW INDEX FROM table_name\G