postgresql 在创建外键关联时报错。

头号大宝贝 发布于 2017/05/31 17:09
阅读 873
收藏 0

中文资料太少。

抛出错误描述:there-is-no-unique-constraint-matching-given-keys-for-referenced-table

异常描述如:https://stackoverflow.com/questions/27159951/there-is-no-unique-constraint-matching-given-keys-for-referenced-table

 

我有一张user表,其中有user_type,需要做外键关联。

关联的另外一张表是,common_type,是一个公共的类型表中,type_value。

user表包含,id,user_type,....

common_type 包含,id,type_code ,type_value,type_name。

加载中
0
chaozhang
chaozhang

http://wiki.navicat.com/wiki/index.php/Why_I_cannot_successfully_create_the_foreign_keys%3F

要在MySQL中声明外键,用户应该牢记几点:
1.两个表都必须是InnoDB类型。 
2.在引用的表中,必须有一个索引,其中引用的列以相同顺序列为第一列。 
3.不支持外键列上的索引前缀。 
4.InnoDB需要外键和引用键的索引,以便可以快速检查外键而不需要表扫描。
5.两个关键字段必须具有兼容的字段类型。
6.整数类型的大小和符号必须相同。 
7.字符串类型的长度不一定相同。 
8.外键名称在数据库中必须是唯一的。
9.如果指定了SET NULL操作,请确保您没有将子表中的列声明为NOT NULL。
要在PGSQL中声明外键,用户应该牢记几点:
1.FOREIGN KEY约束必须引用PRIMARY KEY或UNIQUE约束。 
2.两个关键字段必须具有兼容的数据类型。
3.必须对引用表和引用表都有REFERENCES权限。
要在Oracle中声明外键,用户应牢记几点:
1.FOREIGN KEY约束必须引用PRIMARY KEY或UNIQUE约束。 
2.两个关键字段必须具有兼容的数据类型。 
3.复合外键限制为32列。 
4.必须有权限访问父表和子表。

阿里巴巴开发手册建议,供参考:

【强制】不得使用外键与级联,一切外键概念必须在应用层解决。 
说明:(概念解释)学生表中的student_id是主键,那么成绩表中的student_id则为外键。
如果更新学生表中的student_id,同时触发成绩表中的student_id更新,则为级联更新。
外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。

 

chaozhang
chaozhang
@头号大宝贝 回复@头号大宝贝 : 你可以在pojo/model类设计上做关联,数据库外键在我们项目里也基本去掉了
头号大宝贝
头号大宝贝
感谢。
0
chaozhang
chaozhang

外键应该在另一个表中是唯一的,你是不是没有把type_value标记为唯一

0
头号大宝贝
头号大宝贝

引用来自“chaozhang”的评论

外键应该在另一个表中是唯一的,你是不是没有把type_value标记为唯一

type_value 不可能唯一。

因为这是一个公共的类型表,存在这样的数据例子,code,value,name

USER_TYPE,1,普通用户。

USER_TYPE,2,VIP用户。

GAME_TYPE,1,xx1游戏。

GAME_TYPE,2,xx2游戏。

0
chaozhang
chaozhang

引用来自“头号大宝贝”的评论

引用来自“chaozhang”的评论

外键应该在另一个表中是唯一的,你是不是没有把type_value标记为唯一

type_value 不可能唯一。

因为这是一个公共的类型表,存在这样的数据例子,code,value,name

USER_TYPE,1,普通用户。

USER_TYPE,2,VIP用户。

GAME_TYPE,1,xx1游戏。

GAME_TYPE,2,xx2游戏。

外键跟主键对唯一性的要求是一样的,主键是唯一标识,通过主键查找(唯一键)最多有一条数据,像你这种情况应该要关联另一张表主键

0
头号大宝贝
头号大宝贝

引用来自“头号大宝贝”的评论

引用来自“chaozhang”的评论

外键应该在另一个表中是唯一的,你是不是没有把type_value标记为唯一

type_value 不可能唯一。

因为这是一个公共的类型表,存在这样的数据例子,code,value,name

USER_TYPE,1,普通用户。

USER_TYPE,2,VIP用户。

GAME_TYPE,1,xx1游戏。

GAME_TYPE,2,xx2游戏。

引用来自“chaozhang”的评论

外键跟主键对唯一性的要求是一样的,主键是唯一标识,通过主键查找(唯一键)最多有一条数据,像你这种情况应该要关联另一张表主键

原数据表结构,是由MYSQL迁移过来了。为什么在MYSQL中没问题呢?

huan
huan
因为mysql是数据库中的奇葩
返回顶部
顶部