我在直接在MySQL数据库中工作之前遇到了这样的错误,但是我从那个新错误中尝试过的所有错误都没有用。我已经尽可能多地使用StackOverflow关于此的帖子,但是没有一个解决方案最终起作用。我肯定检查过两个表中都有ID。此外,当我让页面只有一个带有AlbumID和AlbumName的文本输入的表单时,它有用,但我想删掉AlbumID的文本条目,因为它在MySQL数据库中自动增加,因此用户不必输入/猜测新的ID。
错误:SQL错误:
Errno:1452
错误:无法添加或更新子行:外键约束失败(andrew79_601
。Albums
,CONSTRAINT Albums_ibfk_2
FOREIGN KEY(ArtistID
)参考Artists
( ArtistID
))
当我在addalbum.php页面上进行操作时会发生这种情况。 这是我使用的代码: addalbum.php
<?php
//Get All genre
include 'dbconnect.php';
$sql_genre = "SELECT GenreID FROM Genres";
$genre_data = $mysqli->query($sql_genre);
// Get all artists
$sql_artist = "SELECT ArtistID FROM Artists";
$artists_data = $mysqli->query($sql_artist);
?>
<form action="addalbumssrv.php" method="post">
<!-- AlbumID:<input type="text" name="AlbumID" id="AlbumID"/></br> -->
Album Name:<input type="text" name="AlbumName" id="AlbumName"/></br>
<div>
<div class="dev-left">Genre ID: </div>
<div class="dev-left">
<?php if ($genre_data->num_rows > 0) { ?>
<select name="genre" style="width: 150px;">
<option value="">------Select-------</option>
<?php while ($row = $genre_data->fetch_assoc()) {
?>
<option value="<?php echo $row['ID']; ?>">
<?php echo $row['GenreID']; ?>
</option>
<?php }
?>
</select>
<?php
} else {
echo 'No Genre ID Found';
}
?>
</div>
</div>
<!--Artist drop down-->
<div>
<div class="dev-left">Artist ID: </div>
<div class="dev-left">
<?php if ($artists_data->num_rows > 0) { ?>
<select name="artist" style="width: 150px;">
<option value="">------Select-------</option>
<?php while ($row = $artists_data->fetch_assoc()) {
?>
<option value="<?php echo $row['ID']; ?>">
<?php echo $row['ArtistID']; ?>
</option>
<?php }
?>
</select>
<?php
} else {
echo 'No Artist ID Found';
}
?>
</div>
</div>
<input type="submit"/>
</form>
addalbumssrv.php:
<?php
//include 'dbconnect.php';
$link = new mysqli('127.0.0.1', 'andrew79_601', 'csis601', 'andrew79_601');
if ($link->connect_errno) {
echo "Error: Failed to make a MySQL connection, here is why: </br>";
echo "Errno: " . $link->connect_errno . "</br>";
echo "Error: " . $link->connect_error . "</br>";
exit;
}
// Escape user inputs for security
$AlbumID = mysqli_real_escape_string($link, $_REQUEST['AlbumID']);
$AlbumName = mysqli_real_escape_string($link, $_REQUEST['AlbumName']);
// attempt insert query execution
//$sql = "INSERT INTO Albums (AlbumID, AlbumName) VALUES ('$AlbumID', '$AlbumName')";
$sql = "INSERT INTO Albums (AlbumName) VALUES ('$AlbumName')";
if (!$result = $link->query($sql)) {
echo "Error: SQL Error: </br>";
echo "Errno: " . $link->errno . "</br>";
echo "Error: " . $link->error . "</br>";
exit;
}
?>
<script>
window.location='albums.php';
</script>
表格结构: http://imgur.com/xziavSk
答案 0 :(得分:0)
错误消息表示尝试在&#34;相册&#34;中插入或更新行。 table,以及为&#34; ArtistID&#34;提供的值;列无效。
外键约束是强制执行规则:&#34; ArtistID&#34;列必须匹配&#34; ArtistID&#34;中的值&#34; Artists&#34;表
艺术家
ArtistID artist_name
-------- -----------
112 Rush
相册
AlbumID ... ArtistID ...
------- --------
2112 112
如果我们尝试向&#34;专辑&#34;
插入一行INSERT INTO Albums (..., ArtistID ,...) VALUES (..., 707 ,...)
MySQL将检查为&#34; ArtistID&#34;提供的值'707'
。专栏出现在&#34;艺术家&#34;表
当MySQL(InnoDB)在&#34; Albums&#34;中找不到行时在&#34; ArtistID&#34;中具有匹配值列,它将抛出一个外键约束错误。
MySQL正在报道的内容:&#34; Artists&#34;中没有匹配的行。
为了解决这个问题,请&#34; INSERT INTO相册&#34;声明必须为&#34; ArtistID&#34;提供有效值。
如果列允许NULL值,我们可以插入NULL。然后专辑与艺术家无关。
鉴于代码中显示的语句:
INSERT INTO Albums (AlbumName) VALUES ('something')
&#34; ArtistID&#34;必须使用除NULL之外的DEFAULT值定义列,或者使用指定非NULL值的BEFORE INSERT触发器。
声明应该是这样的:
INSERT INTO Albums (AlbumName,ArtistID) VALUES ('something',112)
^^^^^^^^^ ^^^^
为ArtistID列提供有效值。