标签:
MySQL添加字段的方法并不复杂,下面将为您详细介绍MySQL添加字段和修改字段等操作的实现方法,希望对您学习MySQL添加字段方面会有所帮助。
1.登录数据库
>mysql -u root -p 数据库名称
2.查询所有数据表
>show tables;
3.查询表的字段信息
>desc 表名称;
4.1添加表字段
alter table table1 add transactor varchar(10) not Null;
alter table table1 add id int unsigned not Null auto_increment primary key
ALTER TABLE `happy` ADD `credit_card` VARCHAR( 50 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL 添加一个字段 并设为 utf8_general_ci字符
ALTER TABLE `happy` CHANGE `hotel_id` `hotel_id` CHAR( 8 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL 修改 一个字段的字符为utf8_general_ci
ALTER TABLE `happy` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci 修改表默认字符属性为utf8_general_ci
ALTER DATABASE `elong` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci 修改库默认字符属性为 utf8_general_ci
4.2.修改某个表的字段类型及指定为空或非空
>alter table 表名称 change 字段名称 字段名称 字段类型 [是否允许非空];
>alter table 表名称 modify 字段名称 字段类型 [是否允许非空];
>alter table 表名称 modify 字段名称 字段类型 [是否允许非空];
4.3.修改某个表的字段名称及指定为空或非空
>alter table 表名称 change 字段原名称 字段新名称 字段类型 [是否允许非空
4.4如果要删除某一字段,可用命令:ALTER TABLE mytable DROP 字段 名;
4.5 修改表名
alter table 表名 rename to 新表名 
4.6  创建带字符的数据库
CREATE DATABASE db_name DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
4.7 修改数据库字符
ALTER DATABASE db_name DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci
4.8 修改mysql字段顺序的方法:
ALTER TABLE tablename CHANGE `area` `area` VARCHAR(50) AFTER `city` ;
4.9 导出txt
select * from fromtable into outfile "d:/fromtable .txt"; 导出纯数据格式
5.0 关联删除 更新 cascade
	ALTER TABLE `articles` 
	ADD CONSTRAINT `FK_userid` 
	FOREIGN KEY ( `userid` ) 
	REFERENCES `users` ( `id` ) 
	ON DELETE CASCADE ON UPDATE RESTRICT ; 
--解释:当主表users 删除一条记录时 从表articles自动删除所有包含users主键的值
5.1 使用ALTER TABLE语句创建索引 
   其中包括普通索引、UNIQUE索引和PRIMARY KEY索引3种创建索引的格式,
   table_name是要增加索引的表名,
   column_list指出对哪些列进行索引,多列时各列之间用逗号分隔。
   索引名index_name可选,缺省时,MySQL将根据第一个索引列赋一个名称。另外,ALTER TABLE允许在单个语句中更改多个表,因此可以同时创建多个索引
   
   alter table table_name add index index_name (column_list) ;
   alter table table_name add unique (column_list) ;例如 ALTER TABLE  `tbl_option` ADD UNIQUE (`name`)
   alter table table_name add primary key (column_list) ; 创建主键
   
5.2 使用CREATE INDEX语句对表增加索引。能够增加普通索引和UNIQUE索引两种
   create index index_name on table_name (column_list) ;
   create unique index index_name on table_name (column_list) ;
5.3 查看索引
    show index from tblname;
   删除索引
   drop index index_name on table_name ;
   alter table table_name drop index index_name ;
   alter table table_name drop primary key ;
5.4 获取字段信息 enum 等
    show columns  from tbl_user like ‘status‘
    
5.5 导出单个表
D:\xampp\mysql\bin\mysqldump -uroot -padmin elong el_hotel>el_hotel.sql
5.6 输入以下SQL语句,创建一个具有root权限的用户(admin)和密码(12345678):
GRANT ALL PRIVILEGES ON *.* TO ‘admin‘@‘localhost‘ IDENTIFIED BY ‘12345678‘;
GRANT ALL PRIVILEGES ON *.* TO ‘admin‘@‘127.0.0.1‘ IDENTIFIED BY ‘12345678‘;
//授权phplamp用户拥有phplamp数据库的所有权限。
grant all privileges on phplampDB.* to phplamp@localhost identified by ‘1234‘;   (账户不存在,新创建)
如果想指定部分权限给一用户,可以这样来写:
mysql>grant select,update on phplampDB.* to phplamp@localhost identified by ‘1234‘;    (账户不存在,新创建)
远程登陆
GRANT ALL ON *.* TO admin@‘%‘ IDENTIFIED BY ‘admin‘ WITH GRANT OPTION;   
允许任何IP地址(上面的 % 就是这个意思)的电脑 用admin帐户  和密码(admin)来访问这个MySQL Server; root帐户是无法远程登陆的,只可以本地登陆
删除用户帐号
DROP USER user_name;
改名
RENAME USER old_name TO new_name;
查看用户的权限可以用(常用)
SHOW GRANTS FOR user_name;
撤销权限:(常用)
GRANT SELECT ON testdb.* TO user_name; 表示将用户对testdb数据库中所有表的SELECT权限增加.   (账户存在)
REVOKE SELECT ON testdb.* FROM user_name; 表示将用户对testdb数据库中所有表的SELECT权限撤销.  (账户存在)
GRANT  ALL PRIVILEGES ON `hotelinr`.* TO ‘liuzhao‘@‘%‘;    增加拥有数据库hotelinr 的权限   (账户存在)
REVOKE  ALL PRIVILEGES ON `hotelinr`.* FROM ‘liuzhao‘@‘%‘; 撤销拥有数据库hotelinr 的权限   (账户存在)
flush privileges;
5.7 修改mysql账号
update user set Password=password(‘123456‘) where User=‘root‘
5.8 还原Mysql时出现错误:Unknown command ‘\n’   或者 ‘\’ 或者 ‘\\’ 等,
    这是因为编码的不一致把导致的错误,还原的时候可以进行转码:  --default-character-set=utf8 解决
    mysql -uroot -padmin --default-character-set=utf8 taobao <d:/topay_hotels.sql
    
5.9 mysql复制一个数据库中的一张表到另外一个数据库
    Insert into db1.table1 select * from db2.table2
    
6.0 explain [extended] select ... from ... where ...
		type: range  //访问类型
		key: x   //索引名
		Extra: Using where; Using filesort
		
    Explain的type显示的是访问类型,是较为重要的一个指标,结果值从好到坏依次是:
    system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
     一般来说,得保证查询至少达到range级别,最好能达到ref,否则就可能会出现性能问题。
6.1 强制索引 FORCE INDEX (index_name)
   EXPLAIN SELECT author_id FROM `article` FORCE INDEX ( y ) WHERE category_id = 1 AND comments > 1 ORDER BY views DESC LIMIT 1
    
6.2 唯一约束应用到两个字段的组合
   mysql> create table table1 (
    ->  field1 int,
    ->  field2 int,
    ->  unique key (field1,field2)
    -> );
      INSERT table1(field1,field2) VALUES(1,2);以后再 INSERT table1(field1,field2) VALUES(1,2);就不让他插入,
    而INSERT table1(field1,field2) VALUES(1,1);或 INSERT table1(field1,field2) VALUES(2,2); 就可以插入,
    
    新增一个约束
    alter table tablename add unique key 约束名(field1,field2);
    删除唯一约束
    先用SHOW CREATE TABLE table table_name;查询出表结构,然后找到相应字段的索引名,最后删除索引ALTER TABLE table_name DROP INDEX index_name;
6.3 默认值为当前时间
   1、自动UPDATE 和INSERT 到当前的时间:
       `p_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP  
   2、自动INSERT 到当前时间,不过不自动UPDATE
       `p_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP  
   3、一个表中不能有两个字段默认值是当前时间,只能以程序控制
       `p_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,       
       `p_timew2` timestamp NOT NULL DEFAULT ‘0000-00-00 00:00:00‘  
       
6.4 mysql 安装服务 mysqld  --install  mysql3307  在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\项目找到刚才手动安装的服务
修改mysql3307下面的ImagePath数值  "D:\mysql5.1\3307\bin\mysqld" --defaults-file="D:\mysql5.1\3307\my.ini" MySQL3307
6.5 查看表的所有信息:show create table 表名;
    删除主键约束:alter table 表名 drop primary key;
    删除外键约束:alter table 表名 drop foreign key 外键(区分大小写);
    
6.6 查看mysql连接数
    mysqladmin -uroot -p  processlist
    
6.7 复制表结构 表数据
    一、新建表 CREATE TABLE 方法
				整表复制: create table 新表 select * from 旧表;
				结构复制: 1、create table 新表 select * from 旧表 where 1<>1;
				           2、CREATE TABLE 新表  LIKE 旧表;
				
		二、已有表 INSERT INTO 方法
				得到建表语句: show create table 旧表;
				复制数据到新表:
				1、复制旧表的数据到新表(假设两个表结构一样)
				    INSERT INTO 新表  SELECT * FROM 旧表;
				2、复制旧表的数据到新表(假设两个表结构不一样)
				    INSERT INTO 新表(字段1,字段2,…….)  SELECT 字段1,字段2,…… FROM 旧表;
				    
6.8 直接操作mysql 
     mysql -uroot -padmin -e "use el_agency;select username from tbl_user limit 1"
     
6.9 两个关联表之间的关联更新
      update g_products as a,ghotel_room_mapping as b set a.sjl_roomname=b.partner_roomname where  b.partner_roomname!=‘‘ and a.hotelid=b.hotelid and a.roomid=b.roomid and a.rpid=b.rpid
    mysql update 与 left join 一起使用联合多表更新数据
      UPDATE table_1 a LEFT JOIN table_2 b ON b.id = a.id SET field=value WHERE b.field> 10 AND a.field =1
7.0 如果您指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则执行旧行 UPDATE c=c+1 即 有则更新 无则添加
       INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1,visit_time=NOW();
   
   批量插入时 使用ON DUPLICATE KEY UPDATE ,使用VALUES 获取字段中的值
       INSERT INTO aa (`id`,`hid`,`roomid`) VALUES (1,2,7),(2,5,8),(3,5,9),(4,5,10) ON DUPLICATE KEY UPDATE `roomid`=VALUES(roomid)
   
7.1  insert ignore into
     当插入数据时,如出现错误时,如重复数据,将不返回错误,只以警告形式返回。所以使用ignore请确保语句本身没有问题,否则也会被忽略掉
     
7.2 replace into
    如果存在primary or unique相同的记录,则先删除掉。再插入新记录
    
7.3 以XML格式查看查询结果
    shell> mysql --xml
    mysql> SELECT * FROM test.stories;
    
    例如:shell> mysql --xml -u root -padmin -e "use yt_ghotel_data;select * from g_hotels;">d:/aa.xml
    
7.4 select * from table where (ID = 10) or (ID = 32) or (ID = 22) or (ID = 76) or (ID = 13) or (ID = 44) 让结果按10,32,22,76,13,44的顺序检索出来,请问如何书写?
    答:select * from table where (ID = 10) or (ID = 32) or (ID = 22) or (ID = 76) or (ID = 13) or (ID = 44)  order by field(ID,10,32,22,76,13,44)
7.5 整理mysql缓存碎片     FLUSH QUERY CACHE;
    清空mysql缓存         RESET QUERY CACHE;
7.6 批量替换字段内容
    UPDATE 表名 SET 字段名 = REPLACE (字段名, ‘aaa‘, ‘bbb‘);
    
7.7 查看存储过程
    show create procedure proc_name; //查看指定存储过程
    select `name` from mysql.proc where db = ‘your_db_name‘ and `type` = ‘PROCEDURE‘;   //查看全部存储过程
    show function status; 查看全部方法
7.8 新建表时指定使用innodb 还是 MySIAM
    create table xx(
		....
		) engine=myisam 
		查看表使用的哪个引擎
		show  create table tablename; 
                show table status like ‘tablename’\G 
		查看所有引擎及默认引擎 如果想改变默认的存储引擎,可以修改my.ini文件中的default-storage-engine
		show engines
7.9 使用ALTER TABLE把MyISAM表格移动到InnoDB的引擎
    ALTER TABLE tablename CHANGE TYPE=InnoDB
    alter table tablename engine=myisam;
    
8.0 将txt 导入mysql
load data local infile ‘D:\data.txt‘ into table tablename fields terminated by ‘\t‘;
8.1 创建表同时创建索引
  create table tablename(id int(11) primary key auto_increment,hotelid int(8) not null default ‘0‘, index hotelid_inx(hotelid));
  
8.2 查看没有关闭的连接 mysql> show processlist; mysql> show full processlist; 
    查看最大连接数  mysql> show variables like ‘%max_connections%‘;
8.3 查询索引的使用率 show status like “Header_read%”; 值越高表明索引的使用率越高
8.4 大批量添加数据
    对于MyISAM:
			alter table table_name disable keys;
			Loading data//insert 语句
			alter table table_name enable keys;
			对于InnoDB:
		将要导入的数据按照主键排序
			set unique_checks=0,关闭唯一性校验
			set autocommit=0,关闭自动提交
		 	
8.5 sql优化小技巧
      order by null 使用group by分组查询是默认分组后,还要进行排序,这样可能会降低速度。在group by之后加上order by null这样就会阻止排序
      尽量使用left join(左外连接)代替多表查询
      optimize table table_name; 如果你的数据库存储引擎是MyISAM,一定要定时进行碎片清理(否则删除的数据永远不会丢失)
      
8.6 SUBSTRING_INDEX 将某个字段里的内容进行分割并写入到其他字段中
		
		SELECT
		SUBSTRING_INDEX(phone,‘-‘,2) AS PNumber, 
		SUBSTRING_INDEX(phone,‘-‘, -1) AS Ext, 
		phone FROM tb_user  
		WHERE ucid=271338;
		+--------------+------+-------------------+  
		| PNumber      |  Ext |       phone       |  
		+--------------+------+-------------------+  
		| 010-88888882 | 5612 | 010-88888882-5612 |  
		+--------------+------+-------------------+
8.7 去除最后一位字符
    substring(insert_str,1,length(insert_str)-1)   
8.8 查看表的字段comment 备注
    SELECT
COLUMN_NAME,
COLUMN_COMMENT
FROM information_schema.COLUMNS WHERE TABLE_NAME=‘outside_base‘ 
    
8.9 查看数据库的编码方式
    show variables like ‘character%‘;
    
9.0  mysql本地或远程建立function或procedure时报上面的错误 
     my.cnf
     [mysqld] 下加上
     log_bin_trust_function_creators=1
9.0 MySQL快速复制数据库的方法
    #mysqldump db1 -u root -ppassword --add-drop-table | mysql newdb -u root -ppassword
    #mysqldump db1 -uroot -ppassword --add-drop-table | mysql -h 192.168.1.22 newdb -uroo  远程
9.1 批量删除表
Select CONCAT( ‘drop table ‘, table_name, ‘;‘ )  FROM information_schema.tables  Where table_name LIKE ‘hotelrate_%‘;
9.1 source 时很慢
 将innodb_flush_log_at_trx_commit设为0
 set global innodb_flush_log_at_trx_commit=0;
9.2 查看innodb状态
    5.1后版本 show engine innodb status\G;
    5.1前版本 show innodb status\G;
9.3 union ,union all
    union 会去掉重复 适用两个表取并集
    union all 保留重复数据 适用于重合两个表
    
9.4 查询表的自身属性
   desc information_schema.tables;
   SELECT table_name, create_time FROM information_schema.tables WHERE table_name like ‘hotelrate_%‘ and create_time>‘2014-12-02‘;
   
9.5 SELECT UNIX_TIMESTAMP(‘2012-06-08‘)       => 1339084800 
       SELECT UNIX_TIMESTAMP(CURRENT_DATE())  =>1339084800   注: CURRENT_DATE 返回date字符串格式
       SELECT UNIX_TIMESTAMP(NOW())  => 1339123415                      注:NOW()的返回值是一个DATETIME字符串格式 
        SELECT FROM_UNIXTIME(‘1427373406‘,‘%Y-%m-%d %H:%i:%s‘);    =>2015-03-26 20:36:46
        
        
9.6 MySQL的binlog数据查看 
	只查看第一个binlog文件的内容
	mysql>show binlog events;
	查看指定binlog文件的内容
	mysql>show binlog events in ‘mysql-bin.000002‘;
	查看当前正在写入的binlog文件
	mysql>show master status\G
	获取binlog文件列表
	mysql>show binary logs;
	
	本地查看
		基于开始/结束时间
		mysqlbinlog --start-datetime=‘2013-09-10 00:00:00‘ --stop-datetime=‘2013-09-10 01:01:01‘ -d 库名 二进制文件
		基于pos值
		mysqlbinlog --start-postion=107 --stop-position=1000 -d 库名 二进制文件
		
9.7 在频繁的update之后要执行optimize table来消除碎片
9.8 查看表状态  show table status from database \G;  ## data_free 值可以查看碎片占用空间大小
9.9  获取InnoDB行锁争用情况 
        mysql>show status like ‘innodb_row_lock%‘;
        还可以通过设置InnoDB Monitors来进一步观察发生锁冲突的表、数据行等,并分析锁争用的原因
        
10.0  查看表的索引情况
            mysql> show index from tablename\G
10.1 ip to int UNSIGNED
          mysql> select INET_ATON(‘127.0.0.1‘);
          mysql> select INET_NTOA(‘2130706433‘);
          
10.2查看语句是否用到临时表
          EXPLAIN 计划结果的 Extra ,包含 Using Temporary 表示会用到临时表
          
10.3 group_concat 默认是以逗号分隔 可以自定义 ;group_concat有长度限制默认1024  可以手工更改group_concat_max_len 系统变量
mysql> select * from aa;
+------+------+
| id| name |
+------+------+
|1 | 10|
|1 | 20|
|1 | 20|
|2 | 20|
|3 | 200  |
|3 | 500  |
mysql> select id,group_concat(name) from aa group by id;
+------+--------------------+
| id| group_concat(name) |
+------+--------------------+
|1 | 10,20,20|
|2 | 20 |
|3 | 200,500|
mysql> select id,group_concat(name SEPARATOR ‘;‘) from aa group by id; #自定义分隔
+------+--------------------+
| id| group_concat(name) |
+------+--------------------+
|1 | 10;20;20|
|2 | 20 |
|3 | 200;500|
mysql> select id,group_concat(name SEPARATOR ‘;‘) from aa group by id; #排序
+------+--------------------+
| id| group_concat(name order by id desc) |
+------+--------------------+
|1 | 20;20;10|
|2 | 20 |
|3 | 500;200|
mysql> select id,group_concat( DISTINCT name SEPARATOR ‘;‘) from aa group by id; #DISTINCT
+------+--------------------+
| id| group_concat(name order by id desc) |
+------+--------------------+
|1 | 20;10|
|2 | 20 |
|3 | 500;200|
    
标签:
原文地址:http://www.cnblogs.com/wangxusummer/p/4955332.html