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:&nbsp;</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:&nbsp;</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 列提供了有效值。