Mysql使用注意问题

来源:互联网 发布:高中化学大全软件下载 编辑:程序博客网 时间:2024/05/17 08:48

Mysql使用注意问题

  1. duplicate entry for primary key:因为重复向数据库导入已经存在的数据,删除重复的值即可;

  2. mysql 5.5版本中文不能导入的问题:将my.ini中client和server中的字符集改成GBK,如果使用可视化工具(比如navicate)时也要注意选择GBK字符集;

  3. auto_increment:自动插值的列不必在写插入语句的时候出现;
    eg: 这里写图片描述

  4. 在MySQL中有两种方法可以删除数据,一种是DELETE语句,另一种是TRUNCATE TABLE语句。DELETE语句可以通过WHERE对要删除的记录进行选择。而使用TRUNCATE TABLE将删除表中的所有记录。因此,DELETE语句更灵活。

  5. 如果要清空表中的所有记录,可以使用下面的两种方法:
    (1)DELETE FROM table1
    (2)TRUNCATE TABLE table1
    其中第二条记录中的TABLE是可选的。 
    如果要删除表中的部分记录,只能使用DELETE语句。DELETE FROM table1 WHERE …;
    如果DELETE不加WHERE子句,那么它和TRUNCATE TABLE是一样的,但它们有一点不同,那就是DELETE可以返回被删除的记录数,而TRUNCATE TABLE返回的是0。
    如果一个表中有自增字段,使用TRUNCATE TABLE和没有WHERE子句的DELETE删除所有记录后,这个自增字段将起始值恢复成1.如果你不想这样做的话,可以在DELETE语句中加上永真的WHERE,如WHERE 1或WHERE true。
    DELETE FROM table1 WHERE 1;
    上面的语句在执行时将扫描每一条记录。但它并不比较,因为这个WHERE条件永远为true。这样做虽然可以保持自增的最大值,但由于它是扫描了所有的记录,因此,它的执行成本要比没有WHERE子句的DELETE大得多。
    DELETE和TRUNCATE TABLE的最大区别是DELETE可以通过WHERE语句选择要删除的记录。但执行得速度不快。而且还可以返回被删除的记录数。而TRUNCATE TABLE无法删除指定的记录,而且不能返回被删除的记录。但它执行得非常快。
    和标准的SQL语句不同,DELETE支持ORDER BY和LIMIT子句,通过这两个子句,我们可以更好地控制要删除的记录。如当我们只想删除WHERE子句过滤出来的记录的一部分,可以使用LIMIB,如果要删除后几条记录,可以通过ORDER BY和LIMIT配合使用。假设我们要删除users表中name等于”Mike”的前6条记录。可以使用如下的DELETE语句:
    DELETE FROM users WHERE name = ‘Mike’ LIMIT 6;
    一般MySQL并不确定删除的这6条记录是哪6条,为了更保险,我们可以使用ORDER BY对记录进行排序。
    DELETE FROM users WHERE name = ‘Mike’ ORDER BY id DESC LIMIT 6;

  6. 可在建表时可用“AUTO_INCREMENT=n”选项来指定一个自增的初始值。
    可用alter table table_name AUTO_INCREMENT=n命令来重设自增的起始值;

  7. 删除某列:alter table test.consumption drop columnname;

  8. ALTER TABLE tablename auto_increment=’1’ ;执行成功,继续插入就从1开始了。

  9. mysql根据配置文件会限制server接受的数据包大小。

  10. 有时候大的插入和更新会被max_allowed_packet 参数限制掉,导致失败。
    查看目前配置:
    show VARIABLES like ‘%max_allowed_packet%’;
    显示的结果为:

    +——————–+———+
    | Variable_name | Value |
    +——————–+———+
    | max_allowed_packet | 1048576 |
    +——————–+———+

    以上说明目前的配置是:1M
    修改方法
    1) 方法1
    可以编辑my.cnf来修改(windows下my.ini),在[mysqld]段或者mysql的server配置段进行修改。
    max_allowed_packet = 20M
    如果找不到my.cnf可以通过
    mysql –help | grep my.cnf
    去寻找my.cnf文件。
    2) 方法2
    进入mysql server
    在mysql 命令行中运行
    set global max_allowed_packet = 2*1024*1024*10
    然后关闭掉这此mysql server链接,再进入。
    show VARIABLES like ‘%max_allowed_packet%’;
    查看下max_allowed_packet是否编辑成功。

11.update set命令用来修改表中的数据:
update set命令格式:update 表名 set 字段=新值,… where 条件;

12.mysql中不能写类似于 ’某个值‘<’columnname‘<’某个值‘这样的形式,而是要分开写成’某个值‘<’columnname ‘and ‘columnname’<’某个值‘的形式,否则句子不报错,但是无法完成所需的查询。

13.mysql自定义函数举例(2016年Alibaba数据研发实习笔试附加题第1题答案):

```CREATE FUNCTION score(    age INT,    degree CHAR(1),    balance BIGINT(20),    reg_time DATETIME)RETURNS INTBEGIN    DECLARE score INT;    DECLARE diff_year INT;    SET score = 300;    SET diff_year = TIMESTAMPDIFF(YEAR, reg_time, now());     --  计算年龄    IF age BETWEEN 18 AND 30 THEN        SET score = score + 10;    ELSEIF age BETWEEN 31 AND 59 THEN        SET score = score + 20;    END IF;    --  计算学历    IF degree = 'A' THEN         SET score = score + 20;    ELSEIF degree = 'B' THEN        SET score = score + 10;    END IF;    --  计算余额    IF balance >= 100000 THEN        SET score = score + 20;    ELSEIF balance BETWEEN 1000 AND 99999 THEN        SET score = score + 10;    END IF;    --  计算年限    IF diff_year BETWEEN 1 AND 5 THEN        SET score = score + 10;    ELSEIF diff_year > 5 THEN        SET score = score + 20;    END IF;    RETURN (score);END;SELECT t1.uid,t1.acid,t1.regtime,max(t1.score) as uscoreFROM(SELECT    u.user_id uid,    a.account_id acid,    a.reg_time regtime,    score(u.age, u.degree, a.balance, a.reg_time) scoreFROM    accounts aJOIN users u ON u.user_id = a.user_idWHERE a.balance = (        SELECT            MAX(balance)        FROM            accounts        WHERE            user_id = u.user_id    )HAVING a.reg_time >= (    SELECT        MIN(reg_time)    FROM        accounts    WHERE        user_id = u.user_id))t1GROUP BY t1.uidORDER BY t1.uid ASC;```

14 . mysql中的DECLARE语句是在复合语句中声明变量的指令。
在过程中定义的变量并不是真正的定义,只是在BEGIN/END块内定义了而已(译注:也就是形参)。注意这些变量和会话变量不一样,不能使用修饰符@,必须清楚的在BEGIN/END块中声明变量和它们的类型。变量一旦声明,你就能在任何能使用会话变量、文字、列名的地方使用。
有很多初始化变量的方法。如果没有默认的子句,那么变量的初始值为NULL。可以在任何时候使用SET语句给变量赋值。
DECLARE a, b INT DEFAULT 5; 在这里使用了DEFAULT子句来设定初始值,这就不需要把DECLARE和SET语句的实现分开了。 
内部的变量在其作用域内享有更高的优先权。当执行到END语句时,内部变量消失,此时已经在其作用域外,变量不再可见了,因此在存储过程外再也不能找到这个声明了的变量,但是你可以通过OUT参数或者将其值指派 给会话变量来保存其值。 
15.case when的使用举例:
下表有user,score,rating三列,求每个user中score值等于rating值的数目(若两列没有相等的则记为0)
这里写图片描述
代码:

select user,sum(case when score=rating then 1 when score!=rating then 0 end) as sumfrom tablenamegroup by user;

查询结果为:这里写图片描述

1 0