这篇文章用来整理我在使用 mysql 过程中碰到的 errors 及对应的 solutions。
数据库连接错误
1.
solution:
修改 mysql 配置文件 my.cnf
#bind-address=127.0.0.1
restart mysql
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES
mysql 启动失败
1.
error message:
Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'
solution:
mysql 默认是使用 /var/lib/mysql/mysql.sock
启动的。先查看 var/lib
下有没有 mysql
这个目录,没有的话创建一个。查找到 mysql.sock
的所在路径,假设为/path/to/mysql/mysql.sock
,在 /var/lib/mysql
创建一个link:
ln -s /var/lib/mysql/mysql.sock /path/to/mysql/mysql.sock
重启一下 mysql,ok!
注:这个 solution 是剽窃别人的,因为当时只记下了具体的解决方法,并没有表明出处,还请原作者见谅,谢谢
创建外键错误
1.
数据表的存储引擎须支持外键关联。mysql 常用的存储引擎为 myisam
,innodb
,其中 innodb
支持外键关联。
2.
source column
和 referenced column
字段类型、长度、属性须一致。例如:tb_users
表中有字段 group_id int(6)
与 tb_groups
表主键 group_id mediumint(8) unsigned
建立外键关联时会失败:
将两个字段的数据类型统一成 int(6) unsigned
:
3.
已存在数据的两张表之间建立外键关联需注意:source_column
的所有值必须存在于 referenced_column
中。下面的 sql 语句用于判断是否符合这个条件,如果查询的结果为空,说明符合,否则,不符合。
mysql> SELECT DISTINCT source_column FROM source_table WHERE source_column NOT IN (SELECT referenced_column FROM referenced_table);
例如:
mysql> select * from tb_users;
+-----------------------+
| id | group_id |
+-----------------------+
| 1 | 1 |
| 2 | 3 |
+-----------------------+
mysql> select * from tb_gruops;
+---------------------------+
| group_id | group_name |
+---------------------------+
| 1 | superadmin |
| 2 | postadmin |
+---------------------------+
mysql> SELECT DISTINCT group_id FROM tb_users WHERE group_id NOT IN (SELECT group_id FROM tb_groups);
+------------+
| group_id |
+------------+
| 3 |
+------------+
# 这种情况下 tb_users 的 group_id 与 tb_groups 的 group_id 之间就不能建立外键关联。
未完待续......