开发者社区> 问答> 正文

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

中文资料太少。

抛出错误描述: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。

展开
收起
爱吃鱼的程序员 2020-06-08 14:07:46 1177 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    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.如果指定了SETNULL操作,请确保您没有将子表中的列声明为NOTNULL。
    要在PGSQL中声明外键,用户应该牢记几点:1.FOREIGNKEY约束必须引用PRIMARYKEY或UNIQUE约束。2.两个关键字段必须具有兼容的数据类型。3.必须对引用表和引用表都有REFERENCES权限。
    要在Oracle中声明外键,用户应牢记几点:1.FOREIGNKEY约束必须引用PRIMARYKEY或UNIQUE约束。2.两个关键字段必须具有兼容的数据类型。3.复合外键限制为32列。4.必须有权限访问父表和子表。

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

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

     

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

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

    引用来自“chaozhang”的评论

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

    type_value不可能唯一。

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

    USER_TYPE,1,普通用户。

    USER_TYPE,2,VIP用户。

    GAME_TYPE,1,xx1游戏。

    GAME_TYPE,2,xx2游戏。

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

    引用来自“chaozhang”的评论

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

    type_value不可能唯一。

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

    USER_TYPE,1,普通用户。

    USER_TYPE,2,VIP用户。

    GAME_TYPE,1,xx1游戏。

    GAME_TYPE,2,xx2游戏。

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

    引用来自“chaozhang”的评论

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

    type_value不可能唯一。

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

    USER_TYPE,1,普通用户。

    USER_TYPE,2,VIP用户。

    GAME_TYPE,1,xx1游戏。

    GAME_TYPE,2,xx2游戏。

    因为mysql是数据库中的奇葩
    2020-06-08 14:07:59
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
金融级 PostgreSQL监控及优化 立即下载
PostgreSQL在哈啰的实践-周飞 立即下载
PostgreSQL高并发数据库应用数据 立即下载

相关镜像