数据是按照数据结构组织、存储和管理数据的仓库
每一个数据库都有一个或多个不一样的API用于建立,访问,管理,搜索和复制所保存的数据。
咱们也能够将数据存储在文件中,可是在文件中读写数据速度相对较慢。
因此,如今咱们使用关系型数据库管理系统(RDBMS)来存储和管理的大数据量,所谓的关系型数据库,是创建在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
RDBMS即关系数据库的管理系统(Relational Databases Management System)的特色:
一、数据以表格的形式出现
二、每行为各类记录名称
三、每列为记录名称所对应的数据域
四、许多的行和列组成一张表单。
五、若干的表单组成database。java
在咱们开始学习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系统。 linux
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。web
经过如下命令执行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客户端) 使用 mysql 命令链接到Mysql服务器上,默认状况下Mysql服务器的密码为空,因此本实例不须要输入密码。
命令以下:sql
[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服务器是否启动: 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: ******
若是你须要添加 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';
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:刷新权限。
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。下面的表显示了须要的每一个整数类型的存储和范围。
语法 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 关键字用于定义列为主键,你可使用多列来定义主键,列间以逗号分隔。
语法: 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)
语法: 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条信息。
语法: 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";
语法: UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE Clause] update student set age=22,name=="chenxin" where id =1;
语法: DELETE FROM table_name [WHERE Clause] delete from student where id=5;
语法: 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";#区分大小写匹配
语法: 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;#默认按照升序排序。
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命令。 删除,添加或修改表字段 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;
外键,一个特殊的索引,用于关键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使用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和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(可靠性)
一、事务的原子性:一组事务,要么成功,要么撤回。
二、稳定性:有非法数据(外键约束之类),事务撤回
三、隔离性:事务独立运行,一个事务处理后的结果,影响了其余事务,那么其余事务会撤回,事务的100%隔离,须要牺牲速度。
四、可靠性:软、硬件崩溃后,Innodb数据表驱动会利用日志文件重构修改,可靠性和高速度不可兼得,innodb_flush_log_at_trx_commit选项,决定何时把事务保存到日志里。数据库
完成一个事务 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不只要保存数据,还要保存一下索引文件,创建索引会占用磁盘空间索引文件。
编程
建立索引 这是最基本的索引,它没有任何限制,他有如下几种建立方式: 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;
它与前面的普通索引相似,不一样的就是:索引列的值必须惟一,但容许有空值,若是是组合索引,则列值的组合必须惟一,他有如下几种建立方法:
ruby
建立索引 建立索引 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 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