mysql学习总结

----------------------------------------------------------------------
修改字段为auto_increment, 用change
----------------------------------------------------------------------
比如我创建这样一个表
CREATE TABLE people ( peopleid SMALLINT NOT NULL, name CHAR(50) NOT NULL );
我要为peopleid添加一个auto_increment 让他自动增长,开始mysql总是报1075错误;于是查了一下关于mysql 1075的错误,
错误:1075 SQLSTATE: 42000 (ER_WRONG_AUTO_KEY)
消息:不正确的表定义,只能有1个auto列,而且必须将其定义为主键。
这是才明白 原来需要先添加一个主键
alter table people add primary key (peopleid);
alter table people change peopleid peopleid smallint auto_increment ~~~修改字段定义用change oldFname newFname 字段定义

 

修改root密码的方法:

方法1: 用SET PASSWORD命令

  mysql -u root

  mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass');

 

方法2:用mysqladmin

  mysqladmin -u root password 回车, 然后输入两次 newpassword

  如果root已经设置过密码,采用如下方法

  mysqladmin -u root -p oldpass password 回车, 然后输入两次newpassword

 

方法3: 用UPDATE直接编辑user表

  mysql -u root

  mysql> use mysql;

  mysql> UPDATE user SET Password = PASSWORD('newpass') WHERE user = 'root';

  mysql> FLUSH PRIVILEGES;

 

在丢失root密码的时候,可以这样

  mysqld_safe --skip-grant-tables&

  mysql -u root mysql

  mysql> UPDATE user SET password=PASSWORD("new password") WHERE user='root';

  mysql> FLUSH PRIVILEGES;

 


----------------------------------------------------------------------
修改用户权限或者增加修改密码后,都需要flush privileges 刷新权限表
----------------------------------------------------------------------

 

--------------------------------------------------------------
mysql创建外键
--------------------------------------------------------------

为已经添加好的数据表添加外键:

语法:alter table 表名 add constraint FK_ID foreign key(你的外键字段名) REFERENCES 外表表名(对应的表的主键字段名);
例: alter table tb_active add constraint FK_ID foreign key(user_id) REFERENCES tb_user(id)
//FK_ID是外键的名称
/*
CREATE TABLE `tb_active` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `title` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
 `content` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
 `user_id` int(11) NOT NULL,
 PRIMARY KEY (`id`),
 KEY `user_id` (`user_id`),
 KEY `user_id_2` (`user_id`),
 CONSTRAINT `FK_ID` FOREIGN KEY (`user_id`) REFERENCES `tb_user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
*/
 
 
删除外键
语法: ALTER TABLE table-name DROP FOREIGN KEY key-id;
例:   ALTER TABLE `tb_active` DROP FOREIGN KEY `FK_ID`
 
 
 
自动键更新和删除:
外键可以保证新插入的记录的完整性,但是,如果在REFERENCES从句中已命名的表删除记录会怎么样?在使用同样的值作为外键的辅助表中会发生什么?
  
 很明显,那些记录也应该被删除,否则在数据库中就会有很多无意义的孤立记录,MYSQL可以通过向FOREIGN KEY...REFERENCES修饰符添加一个ON DELETE 或ON UPDATE子句简化任务,它告诉了数据库在这种情况如何处理孤立任务
 
 关键字     含义
 CASCADE    删除包含与已删除键值有参照关系的所有记录
 SET NULL   修改包含与已删除键值有参照关系的所有记录,使用NULL值替换(只能用于已标记为NOT NULL的字段)
 RESTRICT   拒绝删除要求,直到使用删除键值的辅助表被手工删除,并且没有参照时(这是默认设置,也是最安全的设置)
 NO ACTION  啥也不做
 
 请注意,通过ON UPDATE 和 ON DELETE规则,设置MYSQL能够实现自动操作时,如果键的关系没有设置好,可能会导致严重的数据破坏,
 例如:如果一系列的表通过外键关系和ON DELETE CASCADE 规则连接时,任意一个主表的变化都会导致甚至只和原始删除有一些将要联系的记录在没有警告的情况被删除,所以,我们在操作之前还要检查这些规则的,操作之后还要再次检查.
 
 
 
添加外键
alter table locstock add foreign key locstock_ibfk2(stockid) references product(stockid)
locstock 为表名, locstock_ibfk2 为外键名 第一个括号里填写外键列名, product为表名,第二个括号里是写外键关联的列名
 
删除外键
alter table locstock drop foreign key locstock_ibfk2
 
查看表有哪些外键
show create table locstock
 
[CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...) 
    REFERENCES tbl_name (index_col_name, ...) 
    [ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION}] 
    [ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION}] 
 
 
         所有tables必须是InnoDB型 ,它们不能是临时表。
·         在引用表中,必须有一个索引,外键列以同样的顺序被列在其中作为第一列。这样一个索引如果不存在,它必须在引用表里被自动创建。
·         在引用表中,必须有一个索引,被引用的列以同样的顺序被列在其中作为第一列。
·         不支持对外键列的索引前缀。这样的后果之一是BLOB和TEXT列不被包括在一个外键中, 这是因为对这些列的索引必须总是包含一个前缀长度。
·         如果CONSTRAINTsymbol 被给出,它在数据库里必须是唯一的。如果它没有被给出,InnoDB自动创建这个名字。
 
 
----------------------------------------------------
show 命令
---------------------------------------------------

show tables或show tables from database_name;
解释:显示当前数据库中所有表的名称

show databases;
解释:显示mysql中所有数据库的名称

show processlist;
解释:显示系统中正在运行的所有进程,也就是当前正在执行的查询。大多数用户可以查看
他们自己的进程,但是如果他们拥有process权限,就可以查看所有人的进程,包括密码。

show table status;
解释:显示当前使用或者指定的database中的每个表的信息。信息包括表类型和表的最新更新时间

 

show columns from table_name from database_name; 或show columns from database_name.table_name;
解释:显示表中列名称

show grants for user_name@localhost;
解释:显示一个用户的权限,显示结果类似于grant 命令

show index from table_name;
解释:显示表的索引

show status;
解释:显示一些系统特定资源的信息,例如,正在运行的线程数量

show variables;
解释:显示系统变量的名称和值

show privileges;
解释:显示服务器所支持的不同权限

show create database database_name;
解释:显示create database 语句是否能够创建指定的数据库

show create table table_name;
解释:显示create database 语句是否能够创建指定的数据库

show engies;
解释:显示安装以后可用的存储引擎和默认引擎。

show innodb status;
解释:显示innoDB存储引擎的状态

show logs;
解释:显示BDB存储引擎的日志

show warnings;
解释:显示最后一个执行的语句所产生的错误、警告和通知

show errors;
解释:只显示最后一个执行语句所产生的错误

-------------------------------------------
Case When 的用法
-------------------------------------------

USE pubs
GO
SELECT  CASE type
            WHEN 'popular_comp' THEN 'Popular Computing'
            WHEN 'mod_cook' THEN 'Modern Cooking'
            WHEN 'business' THEN 'Business'
            WHEN 'psychology' THEN 'Psychology'
            WHEN 'trad_cook' THEN 'Traditional Cooking'
            ELSE 'Not yet categorized'
         END AS type,
      CAST(title AS varchar(25)) AS 'Shortened Title',
      price AS Price
FROM titles
WHERE price IS NOT NULL
ORDER BY type, price
COMPUTE AVG(price) BY type
GO


SELECT  
  case gender
 WHEN 1 THEN 'NAN'
 WHEN 0 THEN 'NV'
end  as gender
FROM
t_swidy_day_nutrient


USE pubs
GO
SELECT    CASE 
            WHEN price IS NULL THEN 'Not yet priced'
            WHEN price < 10 THEN 'Very Reasonable Title'
            WHEN price >= 10 and price < 20 THEN 'Coffee Table Title'
            ELSE 'Expensive book!'
         END as priceLevel,
      CAST(title AS varchar(20)) AS 'Shortened Title'
FROM titles
ORDER BY price
GO

mysql> SELECT name AS Name, 
     -> CASE category 
     -> WHEN "Holiday" THEN "Seasonal" 
     -> WHEN "Profession" THEN "Bi_annual" 
     -> WHEN "Literary" THEN "Random" END AS "Pattern" 
     -> FROM sales; 


SELECT CASE 10*2 
WHEN 20 THEN '20 correct' 
WHEN 30 THEN '30 correct' 
WHEN 40 THEN '40 correct' 
END; 



mysql> SELECT Name, RatingID AS Rating, 
-> CASE RatingID 
-> WHEN 'R' THEN 'Under 17 requires an adult.' 
-> WHEN 'X' THEN 'No one 17 and under.' 
-> WHEN 'NR' THEN 'Use discretion when renting.' 
-> ELSE 'OK to rent to minors.' 
-> END AS Policy 
-> FROM DVDs 
-> ORDER BY Name; 

 

一张表有字段A,B,C 判断最后一个非空的字段是哪个

mysql> create table student(
    -> sid int unsigned not null auto_increment,
    -> name char(30) not null,
    -> passA char(10) default '',
    -> passB char(10) default '',
    -> passC char(10) default '',
    -> primary key (sid)
    -> )engine=innoDb default charset=utf8;

insert into student values  (null, 'alice', 'yes','no','no') , (null, 'sindy', 'yes','yes','no'), (null, 'lion', 'yes','yes', 'yes'), (null, 'idle', 'no', 'no','no');

#顺序查找passA, passB, passC字段最后一个非空的是哪个

mysql> select sid , name, case when passC='yes' then 'C' when passB='yes' then 'B' when passA='yes' then 'A' else 'NO' end as passState from student;

+-----+-------+-----------+
| sid | name | passState |
+-----+-------+-----------+
| 1 | alice | A |
| 2 | sindy | B |
| 3 | lion | C |
| 4 | idle | NO |
+-----+-------+-----------+

 

posted @ 2013-11-10 05:58  stephenykk  阅读(382)  评论(0编辑  收藏  举报