Mysql不常见的插入/更新SQL语句

本文章主要讲解INSERT ... SELECTINSERT ... ON DUPLICATE KEY UPDATE这种比较特殊的数据操作(data manipulation)的SQL。

INSERT INTO … SELECT语句

新建两个测试表,并加入数据:

 CREATE TABLE `test2` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `content` varchar(255) DEFAULT NULL,
  `title` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

 CREATE TABLE `test` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `content` varchar(255) DEFAULT NULL,
  `title` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4;

使用该语句可以将select语句得到的结果快速插入到一个表中

insert into test (content, title) select content, title from test where test.id = 1;

该select语句可以查询其他的表,比如:

INSERT INTO table (id) SELECT table2.id FROM table2 WHERE table2.id > 100;

Continue reading "Mysql不常见的插入/更新SQL语句"

MySQL索引和主键

索引的两种

索引的类型:索引分为聚簇索引和非聚簇索引两种,聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快。

索引的类型

创建索引时字段的length是指索引的长度,可以不指定,length只对字符串类型的字段有效。

Continue reading "MySQL索引和主键"

MySQL: Starting MySQL….. ERROR! The server quit without updating PID file解决办法

这个错误从字面上面看不出来到底是哪里出问题了,我是按照下面这么做解决问题的:

首先定位到自己的my.cnf,我发现我的系统里面有两个my.cnf,于是删掉了一个,在另外一个my.cnf的[mysqld_safe]里面加入了
log-error=/var/lib/mysql/mysqld.log

再次service mysqld start ,ok,查看/var/lib/mysqld.log,看到有如下错误:

Can’t find file: ‘./mysql/user.frm’ (errno: 13 – Permission denied)

如果看过mysql/data目录的人都知道这个是mysql用户的表目录,使用ll /usr/mysql/data看一下,发现所有者竟然是root,于是

sudo chown -R mysql.mysql /usr/mysql/data

然后再次 service mysqld start 就可以启动mysql了。