MySQL的一些tips总结

本文最后更新于2014年10月16日,已超过 1 年没有更新,如果文章内容失效,还请反馈给我,谢谢!

总结一下最近学到的MySQL的tips,做个备忘:

INSERT IGNORE 与 INSERT INTO的区别

INSERT IGNORE 与 INSERT INTO的区别就是:INSERT IGNORE会忽略数据库中已经存在 的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据。INSERT INTO有无数据都插入,如果主键则不插入(而且报错)

insert语句一次可以插入多组值,每组值用一对圆括号括起来,用逗号分隔,如下:

下面通过代码说明之间的区别,如下:


MySQL多表查询


IP地址在MySQL数据库中的存储

两个函数都是根据:A*256*256*256+B*256*256+C*256+D的算法
192*256*256*256+168*256*256+1*256+38 = 3 232 235 814

反过来,从int转换为IP地址分别是php的long2ip()和mysql的INET_NTOA()。
mysql存储这个值是字段需要用int UNSIGNED。不用UNSIGNED的话,128以上的IP段就存储不了了。
传统的方法,创建varchar(15),需要占用15个字节,而改时使用int只需要4字节,可以省一些字节。

PHP存入时:$ip = ip2long($ip);
MySQL取出时:SELECT INET_NTOA(ip) FROM table …
PHP取出时,多一步:$ip = long2ip($ip);

转换以前的数据:

1.把以前的varchar()数据转换为int型的SQL语句:
UPDATE hx_table SET ip = INET_ATON(ip) WHERE INET_ATON(ip) is NOT NULL

2.把字段更改为int型:
ALTER TABLE hx_table CHANGE ip ip INT UNSIGNED NOT NULL

程序做相应修改上传,完成。

因此一种是修改PHP程序,使其肯定存入正数。
另一种是将mysql的这个字段使用int,非UNSIGNED,使其可以存入负数。

参考链接:


待续……

声明: 除非注明,ixyzero.com文章均为原创,转载请以链接形式标明本文地址,谢谢!
https://ixyzero.com/blog/archives/1486.html

《MySQL的一些tips总结》上有5条评论

  1. 在MySQL中查询某一个时间区间内的记录(between…and)

    select * from hockey_stats where game_date between '2016-09-11 00:00:00' and '2016-10-11 23:59:00' order by game_date desc;

    select * from hockey_stats where game_date < '2016-01-01 00:00:00';

  2. MySQL字段如何设置为「当前/当天」的时间?
    https://stackoverflow.com/questions/19246309/how-to-get-current-date-time-in-mysql

    -- 创建时自己填充当前时间 DEFAULT CURRENT_TIMESTAMP
    CREATE TABLE
    servers
    (
    id int(11) NOT NULL PRIMARY KEY auto_increment,
    ...,
    date_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
    );

    -- 插入时用当前时间 NOW()
    INSERT INTO servers (server_name, online_status, exchange, disk_space, network_shares)
    VALUES('m1','ONLINE','exchange','disk_space','network_shares', NOW())

    https://stackoverflow.com/questions/20461030/current-date-curdate-not-working-as-default-date-value

  3. MySQL中如何删除「特定时间之前」的数据?
    https://stackoverflow.com/questions/8359457/deleting-records-before-a-certain-date

    -- 固定时间之前
    DELETE FROM table_name WHERE column_name < '2011-09-21 08:21:22';

    -- 删除 1 天之前的数据
    delete from table_name where column_name < DATE_SUB(NOW() , INTERVAL 1 DAY)

    -- 删除 6 月之前的数据
    delete from table_name where column_name < DATE_SUB(NOW() , INTERVAL 6 MONTH)

    https://dba.stackexchange.com/questions/42892/drop-tables-where-the-last-update-is-over-1-week-ago

  4. MySQL中将多列的组合设置为主键的语法
    https://dba.stackexchange.com/questions/57548/how-to-set-up-multiple-fields-as-primary-key-in-mysql
    https://stackoverflow.com/questions/2642778/multi-column-primary-key-in-mysql-5
    https://dev.mysql.com/doc/refman/5.6/en/create-table.html

    CREATE TABLE yourtable
    (
    employeeid INT,
    blahblah VARCHAR(255),
    blahblah2 VARCHAR(255),
    recordmonth DATE,
    recodrdyear DATE,
    PRIMARY KEY (employeeid, recordmonth, recodrdyear)
    )

发表评论

电子邮件地址不会被公开。 必填项已用*标注