今天往MySQL的一张表里插记录时,出现一个错误提示:
ERROR 1452 : Cannot add or update a child row: a foreign key constraint fails。。。。
仔细观察后才发现该表中有一字段是外键,它参照了另外一张表的主键。
出现错误的原因是:插入外键的数据在另一张表的主键中不存在。
解决方法当然,很简单了,插入另一张表中主键存在的数据呗。。。。。
下面我们来一起探讨一下MySQL的外键吧。。。
一、参照完整性
1。参照完整性规则:
上面这就是参照完整性的定义,说明了一个表中的外键的取值只有两种可能,要么为空,要么只能是它参照的表的主键的值。
因为现实世界中的实体之间往往存在某种联系,在关系模型中实体及实体间的联系都是用关系来描述的。这样就自然存在着关系与关系间的引用啊。当数据库中的一个表与一个或多个表进行关联时都会涉及到参照完整性,这样可以保证数据的一致性和实现一些级联操作。
二、建立MySQL外键关系的前提条件
为了建立两个MySQL表之间的一个外键关系,必须满足以下三种情况:
- * 两个表必须是InnoDB表类型。
- * 使用在外键关系的域必须为索引型(Index)。
- * 使用在外键关系的域必须与数据类型相似。
三、外键的定义:
外键的定义语法:
[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表添加数据1,2,3,接着对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
- 大小: 18.5 KB
- 大小: 25 KB
分享到:
相关推荐
这篇文章主要涉及到在数据创建表时,遇到ERROR 1215 (HY000): Cannot add foreign key constraint 问题方面的内容,对于在数据创建表时,遇到同样问题感兴趣的同学可以参考一下。 一、问题的提出 创建两个表: ...
在MySQL中,外键是实现关系数据库中表与表之间关联的重要工具,它确保了数据的一致性和完整性。然而,在创建外键时,有时会遇到错误代码1005,这个错误通常意味着外键约束无法正确建立。错误信息可能很简单,如"Can'...
2. 删除外键:使用`ALTER TABLE`命令,指定表名和要删除的外键名称,如`ALTER TABLE task DROP FOREIGN KEY FK_Reference_7;` 3. 如果需要,可以接着删除关联的列:`ALTER TABLE task DROP COLUMN `assigned`;`注意...
9. 错误1452: Cannot add or update a child row: a foreign key constraint fails 外键约束失败通常发生在尝试删除或更新父表中的记录,而子表中仍有关联的记录。在执行操作前,先检查并处理好外键约束。 10. 错误...
3. `foreign_key_checks`: 控制外键约束检查,当设置为'NULL'时,意味着禁用外键约束。 4. `unique_checks`: 控制唯一性检查,如果设置为'NULL',则表示在导入数据时不检查唯一性。 5. `character_set_client`: 指定...
### MySQL常见错误及解决方案 #### 问题1:使用MySQL CommandLine Client,出现闪一下然后窗口就消失的情况,如何解决? 在初次使用MySQL CommandLine Client时,可能会遇到一个常见的问题:客户端窗口短暂显示后...
外键是一列数据,引用另一个表的主键,用于建立两个表之间的关联,确保数据的一致性和完整性。 9. **如何在MySQL中创建外键?** 使用`ALTER TABLE`语句加上`FOREIGN KEY`约束,如`ALTER TABLE table_name ADD ...
Foreign key reference failure for value=', parameter)); ``` 这里的DECLARE语句定义了一个EXIT HANDLER,当错误1452(外键引用失败)发生时,它会执行插入错误日志的语句。`EXIT`关键字意味着一旦错误处理执行...
例如,`duplicate_key`对应于错误1062(数据重复),`foreign_key_violated`对应于错误1216(外键约束违反),这些是常见的数据库操作错误。 然后,声明了一个变量`l_manager_id`和一个游标`csr_mgr_id`。游标用于...
3. 添加外键约束:`ALTER TABLE 从表 ADD CONSTRAINT FK_从表_主表 FOREIGN KEY (外键字段) REFERENCES 主表(主键字段)` 4. 删除主键约束:`ALTER TABLE 表名 DROP PRIMARY KEY` 5. 删除外键约束:`ALTER TABLE 表名...
如果需要,可以暂时禁用外键约束(`SET FOREIGN_KEY_CHECKS=0;`),完成导入后再启用(`SET FOREIGN_KEY_CHECKS=1;`)。 3. **对比表结构**:对比源数据库和目标数据库的表结构,确保它们完全一致。如果有差异,...
7. 错误代码1452: "Cannot add or update a child row: a foreign key constraint fails",意味着你尝试添加或更新的数据违反了外键约束,父表中没有对应的记录。 8. 错误代码1366: "Incorrect integer value: '...
约束保证数据完整性,如主键约束`PRIMARY KEY`,外键约束`FOREIGN KEY`。 8. **备份与恢复**:使用`mysqldump`工具进行数据库备份,如`mysqldump -u root -p dbname > backup.sql`。恢复则使用`mysql -u root -p ...
- `trx_last_foreign_key_error`:最后一次外键错误。 - `trx_adaptive_hash_latched`:自适应哈希锁定的开关。 - `trx_adaptive_hash_timeout`:自适应哈希超时值。 #### 四、解决死锁的方法 1. **优化SQL语句**...
- `Time`表记录用户的可用时间,并通过外键与`User`表关联。 - 插入了几条示例数据到`User`表和`Time`表中。 通过以上步骤,我们可以成功地在不同的操作系统上配置C++连接MySQL的环境,并且创建了一个简单的...
- **Latest ForeignKey Error**:最近发生的外键错误信息。 - **Latest Detect Deadlock**:最近检测到的死锁情况。 - **File I/O**:文件I/O操作统计,包括读写次数、速度等。 - **Insert Buffer and Adaptive Hash...
解决办法是在执行`LOAD DATA INFILE`之前,设置`FOREIGN_KEY_CHECKS = 0`,以禁止外键检查,执行后再将该值重置为1,即`FOREIGN_KEY_CHECKS = 1`。 此外,实验还涵盖了对整个教学管理系统(jxgl)的完整备份和恢复...