如何向有外键约束的字表中插入记录?

php中文网
发布: 2016-06-23 14:03:10
原创
1042人浏览过

我在mysql中建了两个表
mysql> describe room;
+--------+----------+------+-----+---------+-------+
| Field  | Type     | Null | Key | Default | Extra |
+--------+----------+------+-----+---------+-------+
| name   | char(20) | NO   | PRI | NULL    |       |
| doctor | char(20) | NO   |     | NULL    |       |
+--------+----------+------+-----+---------+-------+
2 rows in set (0.07 sec)

字表是
mysql> describe guahao;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| name  | char(20) | NO   | PRI | NULL    |       |
| sex   | char(10) | NO   |     | NULL    |       |
| age   | char(10) | NO   |     | NULL    |       |
| room  | char(20) | NO   | MUL | NULL    |       |
+-------+----------+------+-----+---------+-------+
4 rows in set (0.00 sec)
其中外键是room,on delete cascade on update cascade

我在命令行中向字表中插入数据没有问题,结果是
mysql> insert into guahao values
    -> ('小张','男','30','皮肤科');
Query OK, 1 row affected (0.04 sec)

mysql> select * from guahao;
+--------+-----+-----+-----------+
| name   | sex | age | room      |
+--------+-----+-----+-----------+
| 王八 | 女 | 60  | 内科    |
| 钱二 | 男 | 40  | 脑科    |
| 赵一 | 男 | 20  | 五官科 |
| 孙三 | 女 | 35  | 骨科    |
| 寂寞 | 男 | 22  | 骨科    |
| 小张 | 男 | 30  | 皮肤科 |
| 小明 | 男 | 25  | 脑科    |
| 李四 | 男 | 30  | 皮肤科 |
+--------+-----+-----+-----------+
9 rows in set (0.00 sec)
但是我用PHP的时候,同样的插入语句,却会报错,错误信息如下:
Cannot add or update a child row: a foreign key constraint fails (`clinic`., CONSTRAINT `#sql-9e_13_ibfk_1` FOREIGN KEY (`room`) REFERENCES `room` (`name`) ON DELETE CASCADE ON UPDATE CASCADE)
请大神帮我看看问题在哪!跪求!哭了,问过一次,没解决问题。


回复讨论(解决方案)

为什么这个问题没有人回复?不是很难的问题啊

1、你的操作系统?
2、你的程序使用的字符集?
3、为了给帮助你的人提供便利,你应该给出
a、建表的 sql 指令
b、供测试用的 php 代码



吼吼,快来人解答~~

1、你的操作系统?
2、你的程序使用的字符集?
3、为了给帮助你的人提供便利,你应该给出
a、建表的 sql 指令
b、供测试用的 php 代码
1. 操作系统是MAC OS X
2. 字符集是
mysql> show variables like 'character%';
+--------------------------+--------------------------------------------------------+
| Variable_name            | Value                                                  |
+--------------------------+--------------------------------------------------------+
| character_set_client     | latin1                                                 |
| character_set_connection | latin1                                                 |
| character_set_database   | latin1                                                 |
| character_set_filesystem | binary                                                 |
| character_set_results    | latin1                                                 |
| character_set_server     | latin1                                                 |
| character_set_system     | utf8                                                   |
| character_sets_dir       | /usr/local/mysql-5.1.63-osx10.6-x86_64/share/charsets/ |
+--------------------------+--------------------------------------------------------+
8 rows in set (0.08 sec)
用于插入数据库的数据是从一个编码为UTF-8的HTML页面用post方法传到一个编码同样为UTF-8的PHP文件。


3.  

建表的sql指令是在终端输入的  如下
mysql> create table room(name char(20) not null primary key, doctor char(20) not null) type=innodb;
Query OK, 0 rows affected, 1 warning (0.05 sec)

mysql> create table guahao    -> (name char(20) not null primary key,    -> sex char(10) not null,
    -> age char(10) not null,
    -> room char(20) not null,
    -> foreign key(room) references room(name) on delete cascade on update cascade)
    -> type=innodb;
Query OK, 0 rows affected, 1 warning (0.41 sec)

PHP代码是

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=GB18030"><title>医院门诊挂号系统</title><style type="text/css">	#table	{		margin-right: auto;		margin-left: auto;	}</style></head><body style="text-align: center"><?php$pname=$_POST['pname'];$psex=$_POST['psex'];$page=$_POST['page'];$room=$_POST['room'];if (empty($pname)||empty($psex)||empty($page)){?><p style="text-align:center">请输入完整的患者信息!</p><form method="post" action="Guahao.php"><table id="table"><tr><td>姓名:</td><td><input type="text" id="pname" /></td><td>性别:</td><td><input type="text" id="psex" /></td></tr><tr><td>年龄:</td><td><input type="text" id="page" /></td><td>科室:</td><td><input type="text" id="room" /></td></tr></table><input type="reset" value="重置" id="reset" style="width:100px;height:20px" /><input type="submit" value="挂号" id="submit" style="width:100px;height:20px" /></form><?php}else{	$db = new mysqli('127.0.0.1','clinicadmin','clinicadmin','clinic');	if (mysqli_connect_errno())	{		echo "无法连接数据库,请稍后重试。";		exit;	}			$query = "insert into guahao values			('".$pname."', '".$psex."', '".$page."', '".$room."')";			$result = $db->query($query);	if (!$result)	{		echo $db->error;		echo"无法登陆!";		exit;	}	else	{		echo"<p>挂号成功!</p>
                    <div class="aritcle_card">
                        <a class="aritcle_card_img" href="/ai/1971">
                            <img src="https://img.php.cn/upload/ai_manual/000/000/000/175679994166405.png" alt="如知AI笔记">
                        </a>
                        <div class="aritcle_card_info">
                            <a href="/ai/1971">如知AI笔记</a>
                            <p>如知笔记——支持markdown的在线笔记,支持ai智能写作、AI搜索,支持DeepseekR1满血大模型</p>
                            <div class="">
                                <img src="/static/images/card_xiazai.png" alt="如知AI笔记">
                                <span>27</span>
                            </div>
                        </div>
                        <a href="/ai/1971" class="aritcle_card_btn">
                            <span>查看详情</span>
                            <img src="/static/images/cardxiayige-3.png" alt="如知AI笔记">
                        </a>
                    </div>
                ";	}		$db->close();?><a href="guahao.html">继续挂号</a><?php} ?></body></html>
登录后复制

字符集问题!
1、你的表中没有给字符类型字段设置字符集(默认 latin1)
2、你在连接数据库后没有声明字符集(缺少 set names 指令)
3、你说你使用了 utf-8 字符集,而程序中有  charset=GB18030
实际是使用了gbk 字符集

GB18030 是正式的国家标准,目前尚未在计算机中实现。所以实际使用的是其子集--GBK

忽略外键:SET FOREIGN_KEY_CHECKS = 0

字符集问题!
1、你的表中没有给字符类型字段设置字符集(默认 latin1)
2、你在连接数据库后没有声明字符集(缺少 set names 指令)
3、你说你使用了 utf-8 字符集,而程序中有  charset=GB18030
实际是使用了gbk 字符集

GB18030 是正式的国家标准,目前尚未在计算机中实现。所以实际使用的是其子集--GBK
那个问题我已经解决了,就是字符集问题,谢谢斑竹大神!这么多天才来结贴

字符集问题!
1、你的表中没有给字符类型字段设置字符集(默认 latin1)
2、你在连接数据库后没有声明字符集(缺少 set names 指令)
3、你说你使用了 utf-8 字符集,而程序中有  charset=GB18030
实际是使用了gbk 字符集

GB18030 是正式的国家标准,目前尚未在计算机中实现。所以实际使用的是其子集--GBK
    ……

版主你好,我用跟楼主一样的建表命令建表,但是不能插入和楼主一样的数据,提示foreign constraints fails,请问该怎么解决呢?

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号