为什么我不能成功地创建外键?
更新于 2016年08月11日04:37
可应用操作系统:iOS
可应用 Navicat 产品:Navicat for MySQL、Navicat for PostgreSQL
可应用 Navicat 版本编号:全部
MySQL & MariaDB
如果你收到 MySQL 错误如 1005: Can't create table '.\mydb\#sql-44c_1c.frm'(errno: 150),它是由于创建外键失败。有些可能的情况导致在 MySQL 数据库创建外键失败。这些错误都关系到MySQL 本身。
例子情况:
1. 如果两个字段(字段名和外键名)使用不相容的字段类型。
2. 如果你使用 "On Delete Set Null",但字段不允许 null。
要在 MySQL 声明外键,用户应该紧记几个要点:
1. 两个表必须是 InnoDB 类型。
2. 在参考的表,必须有一个索引,参考的列被行为第一列的排序相同。
3. 不支持索引前缀在外键列。
4. InnoDB 需要索引在外键和参考键,以便外键检查可以快速,不需要表扫描。
5. 两个键字段必须有相容的字段类型。
6. 整数类型的大小和符号必须是相同。
7. 字符串类型的长度不一定是相同。
8. 外键的名在数据库中必须是唯一的。
9. 如果你指定一个 SET NULL 动作,确保你没有在子表中声明列为 NOT NULL.
欲了解更多外键限制的详细信息,请访问 - http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html
PostgreSQL
如果你收到 PostgreSQL 错误如 ERROR: there is no unique constraint matching given keys for referenced table "xxxx",它是由于创建外键失败。
要在 PGSQL 声明外键,用户应该紧记几个要点:
1. FOREIGN KEY 限制必须参考 PRIMARY KEY 或 UNIQUE 限制。
2. 两个键字段必须有相容的数据类型。
3. 必须在参考和被参考的表有 REFERENCES 权限。