SQL 错误 1452 仅在使用 auto_increment 从 PHP 页插入行时发生
SQL Error 1452 only occurs when Inserting row from PHP page using auto_increment
编辑:我尝试从 PhpMyAdmin 插入一个 INSERT INTO。我注意到如果我只执行 GenreName 并且不输入 ID,AutoIncrement 会给我一个行 ID 2147483647:
插入流派(流派名称)
值('testFromPhpmyAdmin')
我之前直接在 MySQL 数据库中工作时遇到了这样的错误,但是我从过去的错误中尝试的所有方法都没有用。我已经用尽了尽可能多的关于此的 Whosebug 帖子,但 none 的解决方案最终起作用了。我确实检查了两个表中的 ID 是否可用。此外,当我的页面只有一个带有 AlbumID 和 AlbumName 文本输入的表单时它起作用了,但我想摆脱 AlbumID 的文本输入,因为它在 MySQL 数据库中自动递增,因此用户不必 type/guess一个新ID。
错误:SQL错误:
错误号:1452
错误:无法添加或更新子行:外键约束失败 (andrew79_601
.Albums
, CONSTRAINT Albums_ibfk_2
FOREIGN KEY (ArtistID
) REFERENCES 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>
Table结构:
http://imgur.com/xziavSk
错误消息表示试图在 "Albums" table 中插入或更新一行,而为 "ArtistID" 列提供的值无效。
外键约束正在执行规则:"ArtistID" 列中的值 必须匹配 "ArtistID" 列中的值 "Artists" table.
艺术家
ArtistID artist_name
-------- -----------
112 Rush
专辑
AlbumID ... ArtistID ...
------- --------
2112 112
如果我们尝试向 "Albums"
插入一行
INSERT INTO Albums (..., ArtistID ,...) VALUES (..., 707 ,...)
MySQL 将检查为 "ArtistID" 列提供的值 '707'
是否出现在 "Artists" table.
中
当MySQL (InnoDB) 在"Albums" 中找不到与"ArtistID" 列中的匹配值的行时,它将抛出外键约束错误。
这就是 MySQL 的报告:"Artists" 中没有匹配的行。
要解决此问题,"INSERT INTO Albums" 语句必须为 "ArtistID" 提供有效值。
如果列允许 NULL 值,我们可以插入 NULL。那么这张专辑就不会与艺术家相关了。
鉴于代码中显示的语句:
INSERT INTO Albums (AlbumName) VALUES ('something')
"ArtistID" 列必须使用 NULL 以外的 DEFAULT 值定义,或者有一个 BEFORE INSERT 触发器分配了一个非 NULL 值。
语句大概应该是这样的:
INSERT INTO Albums (AlbumName,ArtistID) VALUES ('something',112)
^^^^^^^^^ ^^^^
为 ArtistID 列提供了有效值。
编辑:我尝试从 PhpMyAdmin 插入一个 INSERT INTO。我注意到如果我只执行 GenreName 并且不输入 ID,AutoIncrement 会给我一个行 ID 2147483647: 插入流派(流派名称) 值('testFromPhpmyAdmin')
我之前直接在 MySQL 数据库中工作时遇到了这样的错误,但是我从过去的错误中尝试的所有方法都没有用。我已经用尽了尽可能多的关于此的 Whosebug 帖子,但 none 的解决方案最终起作用了。我确实检查了两个表中的 ID 是否可用。此外,当我的页面只有一个带有 AlbumID 和 AlbumName 文本输入的表单时它起作用了,但我想摆脱 AlbumID 的文本输入,因为它在 MySQL 数据库中自动递增,因此用户不必 type/guess一个新ID。
错误:SQL错误:
错误号:1452
错误:无法添加或更新子行:外键约束失败 (andrew79_601
.Albums
, CONSTRAINT Albums_ibfk_2
FOREIGN KEY (ArtistID
) REFERENCES 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>
Table结构: http://imgur.com/xziavSk
错误消息表示试图在 "Albums" table 中插入或更新一行,而为 "ArtistID" 列提供的值无效。
外键约束正在执行规则:"ArtistID" 列中的值 必须匹配 "ArtistID" 列中的值 "Artists" table.
艺术家
ArtistID artist_name
-------- -----------
112 Rush
专辑
AlbumID ... ArtistID ...
------- --------
2112 112
如果我们尝试向 "Albums"
插入一行INSERT INTO Albums (..., ArtistID ,...) VALUES (..., 707 ,...)
MySQL 将检查为 "ArtistID" 列提供的值 '707'
是否出现在 "Artists" table.
当MySQL (InnoDB) 在"Albums" 中找不到与"ArtistID" 列中的匹配值的行时,它将抛出外键约束错误。
这就是 MySQL 的报告:"Artists" 中没有匹配的行。
要解决此问题,"INSERT INTO Albums" 语句必须为 "ArtistID" 提供有效值。
如果列允许 NULL 值,我们可以插入 NULL。那么这张专辑就不会与艺术家相关了。
鉴于代码中显示的语句:
INSERT INTO Albums (AlbumName) VALUES ('something')
"ArtistID" 列必须使用 NULL 以外的 DEFAULT 值定义,或者有一个 BEFORE INSERT 触发器分配了一个非 NULL 值。
语句大概应该是这样的:
INSERT INTO Albums (AlbumName,ArtistID) VALUES ('something',112)
^^^^^^^^^ ^^^^
为 ArtistID 列提供了有效值。