数据库表中外键的创建

**

Can’t create table ‘.\xyrensheju#sql-710_6.frm’ (errno: 150)

**
我创建外键时,得到了这个错误,我对表和字段检查了又检查,始终没有发现问题出现在哪里,百度了很多下,终于找到了解决的办法,是我的主表的复合主键索引没有单独的建出来(就是两个复合主键中的一个主键被别的表作为了外键,那么这个主键就必须得单独建一个索引)。随后,我又对创建外键问题进行了一些简单的研究,发现以下情况都会导致这个错误:

1、两个字段的数据类型不一致。例如,一个是int(10),而另一个却是varchar(10)。你还要检查,是不是一个选择了无符号,而另一个没有选择。

2、主表字段不是主键,如果你不能把它设为主键,那么可以为其创建一个索引。

3、主表字段是复合主键的一部分,并且这个字段没有它自己的索引。如果是这个问题,那么就为这个字段创建一个单独的索引吧。

4、外键指定了删除时SET NULL,但是该字段被设置为NOT NULL。Mysql无法解决这个问题,你只能修改其中一个地方的设置了。

5、外键的名字重复了。一个数据库中外键名字必须是唯一的。试着添加一些随机字符看看能不能创建成功。

6、ALTER语句写错了,从表表名写错了,从表字段写错了,主表表名写错了,主表字段写错了。。。

如果你也遇到了同样的问题,经历以上步骤后,希望你的问题能够得到解决。如果你通过其他的办法解决了这一问题,也欢迎并感谢您写下评论。以供“后人”借鉴。

### PostgreSQL 中外约束的使用方法及常见问题 #### 创建约束 在的概念中,它是用于维护两个之间关系的一种机制。在 PostgreSQL 中创建时,可以通过 `CREATE TABLE` 或者 `ALTER TABLE` 来定义这种约束。以下是具体的语法: ```sql -- 在创建时定义 CREATE TABLE child_table ( id SERIAL PRIMARY KEY, parent_id INTEGER REFERENCES parent_table(parent_id), name VARCHAR(100) ); ``` 上述代码展示了如何在一个新中设置[^1]。这里的关字 `REFERENCES` 明了当前列与另一张中的某一列存在关联。 对于已经存在的,则可以采用如下方式添加: ```sql -- 对现有添加 ALTER TABLE child_table ADD CONSTRAINT fk_parent FOREIGN KEY (parent_id) REFERENCES parent_table(id); ``` 此命令通过 `ALTER TABLE` 添加了一个名为 `fk_parent` 的到已有上,并指定了该所参照的目标及其对应字段。 #### 删除约束 当需要移除约束时,在 PostgreSQL 中可以直接操作系统的元数据来完成这一动作。例如下面这条 SQL 命令能够删除特定模式下的所有匹配前缀条件的记录: ```sql DELETE FROM pg_constraint WHERE conname LIKE 'tbl_parent%'; ``` 这段脚本实现了对名称以 `'tbl_parent'` 开头的相关条目的清理工作[^2]。 值得注意的是,不同的数据库管理系统可能有不同的处理逻辑。比如 MySQL 数据库里要先查找出具体的名字再执行相应的删除指令;而在 PostgreSQL 上面则相对更加灵活一些,允许直接针对内部存储这些对象信息的地方进行修改[^3]。 #### 的作用与意义 作为关系型数据库的重要组成部分之一,主要承担着保障跨间引用完整性的职责。它确保了一方的数据始终指向另一方合法有效的实体实例,从而减少了孤立或者错误链接的风险。同时也能促进应用程序设计阶段就考虑到业务流程里的依赖关系,提高整体架构质量[^4]。 #### 常见问题解答 - **Q:** 如果忘记了自己的某个叫什么名字怎么办? 可以利用系统视图查询得到相关信息: ```sql SELECT * FROM information_schema.table_constraints WHERE constraint_type='FOREIGN KEY'; ``` 这样就可以查看所有的详情列了。 - **Q:** 当尝试插入违反规则的新纪录时报错该如何应对? 需确认源端是否有对应的主值存在以及目标端是否设置了级联更新/删除选项等配置参数正确无误后再重试操作即可解决问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值