MySql外键关联Foreign key及error 1452

      今天往MySQL的一张表里插记录时,出现一个错误提示:

ERROR 1452 : Cannot add or update a child row: a foreign key constraint fails。。。。 



 

      仔细观察后才发现该表中有一字段是外键,它参照了另外一张表的主键。

出现错误的原因是:插入外键的数据在另一张表的主键中不存在。

    解决方法当然,很简单了,插入另一张表中主键存在的数据呗。。。。。

 

    下面我们来一起探讨一下MySQL的外键吧。。。

 

一、参照完整性

   1。参照完整性规则:

          

 

 

     上面这就是参照完整性的定义,说明了一个表中的外键的取值只有两种可能,要么为空,要么只能是它参照的表的主键的值。

     因为现实世界中的实体之间往往存在某种联系,在关系模型中实体及实体间的联系都是用关系来描述的。这样就自然存在着关系与关系间的引用啊。当数据库中的一个表与一个或多个表进行关联时都会涉及到参照完整性,这样可以保证数据的一致性和实现一些级联操作。

 

二、建立MySQL外键关系的前提条件

     为了建立两个MySQL表之间的一个外键关系,必须满足以下三种情况:    

  1.   * 两个表必须是InnoDB表类型。   
  2.   * 使用在外键关系的域必须为索引型(Index)。        
  3.   * 使用在外键关系的域必须与数据类型相似。 

三、外键的定义:

外键的定义语法:
[CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)
    REFERENCES tbl_name (index_col_name, ...)
    [ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
    [ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]


      该语法可以在 CREATE TABLE 和 ALTER TABLE 时使用,如果不指定CONSTRAINT symbol,MYSQL会自动生成一个名字。
ON DELETE、ON UPDATE表示事件触发限制,可设参数:
RESTRICT(限制外表中的外键改动)
CASCADE(跟随外键改动)
SET NULL(设空值)
SET DEFAULT(设默认值)
NO ACTION(无动作,默认的)

 

举例:建表

 

      新建一个parts的表,cpu字段用来存放所有的cpu配件型号,再新建一个pc的表,其中的cpumodel字段用来存放pc机中的cpu型号,显然,cpumodel字段中的所有记录应该存在于parts表中。    

mysql> create table parts(    

    -> cpu varchar(20) not null primary key,    

    -> index(cpu)    

    -> )engine=innodb;    

Query OK, 0 rows affected (0.01 sec)    

  

mysql> create table pc(    

    -> cpumodel varchar(20) not null,    

    -> index(cpumodel),    

    -> constraint fk_pc  foreign key(cpumodel) references parts(cpu)    

    -> )engine=innodb;    

Query OK, 0 rows affected (0.01 sec)    

  

注意:对于非InnoDB表, FOREIGN KEY 语句将被忽略。对parts表添加数据123,接着对pc表进行测试,满足条件的 1 可以顺利insert进去,而不符合条件的字符 5 在insert表的时候,出现外键约束性错误,这正是我们想要的结果    

  

  

mysql> insert into parts values('1'),('2'),('3');    

Query OK, 3 rows affected (0.00 sec)    

Records: 3  Duplicates: 0  Warnings: 0    

  

mysql> insert into pc values('1');    

Query OK, 1 row affected (0.01 sec)    

  

  

mysql> insert into pc values('5');    

 

ERROR 1452 (23000): Cannot add or update a child row: a foreign    

key constraint fails (`Orange/pc`, CONSTRAINT `pc_ibfk_1` FOREIGN KEY    

(`cpumodel`) REFERENCES `parts` (`cpu`))   

 

四、外键的删除

 

这个fk_pc就是表pc的外键,用来为删除外键定义用的,如下所示:
mysql> ALTER TABLE pc DROP FOREIGN KEY fk_pc;
Query OK, 1 row affected (0.25 sec)
Records: 1 Duplicates: 0 Warnings: 0

这样pc.cpumodel外键定义就被删除了,但是如果定义时没有指定CONSTRAINT fk_pc (即外键符号)时该怎么删除呢?别急,没有指定时,MySQL会自己创建一个,可以通过以下命令查看:
mysql> show create table pc;

 

CREATE TABLE `pc` (
  `cpumodel` varchar(20) NOT NULL,
  KEY `cpumodel` (`cpumodel`),
  CONSTRAINT `pc_ibfk_1` FOREIGN KEY (`cpumodel`) REFERENCES `parts` (`cpu`) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE=InnoDB DEFAULT CHARSET=latin1

 

就可以看到外键别名pc_ibfk_1  然后,就可以执行以下命令删除外键定义:

mysql> ALTER TABLE   pc  DROP FOREIGN KEY pc_ibfk_1;
Query OK, 1 row affected (0.66 sec)
Records: 1 Duplicates: 0 Warnings: 0

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL中,删除时可能会出现错误。其中一个常见的错误是"Error on rename of...",错误代码为152。这个错误通常是由于约束导致的,意味着在删除之前存在相关联的数据。要解决这个问题,可以使用以下方法: 1.首先,可以通过查询表的信息来找到约束的名称。可以使用命令"show keys from tableName"来查看表的信息。 2.然后,可以使用"alter table tableName drop foreign key FKxxxxxxxxxxxxxx"的语句来删除指定名称的。 3.此,还可以在删除语句之前加上"SET FOREIGN_KEY_CHECKS=0"的语句,以取消MySQL中的约束。这样,删除时将不再检查相关联的数据是否存在。 综上所述,要解决MySQL无法删除的问题,可以通过查询表的信息找到约束的名称,并使用"alter table"语句来删除指定的。另,还可以使用"SET FOREIGN_KEY_CHECKS=0"来取消MySQL中的约束。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [MySQL删除问题小结](https://download.csdn.net/download/weixin_38612139/12829228)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [mysql删不掉的问题](https://blog.csdn.net/ThisTimed/article/details/17770809)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [MySQL中包含无法删除数据的解决方案](https://blog.csdn.net/Zou_05/article/details/119937740)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值