0

编辑:我尝试了来自 PhpMyAdmin 的 INSERT INTO。我注意到如果我只是做 GenreName 而没有输入 ID,AutoIncrement 会给我一个行 ID 2147483647 : INSERT INTO Genres( GenreName ) VALUES ('testFromPhpmyAdmin')

我之前在直接在 MySQL 数据库中工作时遇到过这样的错误,但是我从过去的错误中尝试的所有方法都不起作用。我已经用尽了尽可能多的 StackOverflow 帖子,但没有一个解决方案最终奏效。我确实检查了两个表中的 ID 是否可用。此外,当我的页面只是有一个带有 AlbumID 和 AlbumName 文本输入的表单时,它起作用了,但我想摆脱 AlbumID 的文本条目,因为它在 MySQL DB 中自动递增,因此用户不必键入/猜测新的ID。

错误:SQL 错误:Errno:1452 错误:无法添加或更新子行:外键约束失败 ( andrew79_601. Albums, CONSTRAINT Albums_ibfk_2FOREIGN 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>

表结构:http: //imgur.com/xziavSk

4

1 回答 1

0

该错误消息意味着尝试在“专辑”表中插入或更新行,并且为“ArtistID”列提供的值无效。

外键约束强制执行一个规则:“ArtistID”列中的值必须与“Artists”表的“ArtistID”列中的值匹配。

艺术家

ArtistID  artist_name
--------  -----------
     112  Rush

专辑

AlbumID  ... ArtistID ...
-------      --------
   2112           112  

如果我们尝试在“相册”中插入一行

INSERT INTO Albums (..., ArtistID ,...) VALUES (..., 707 ,...) 

MySQL 将检查'707'为“ArtistID”列提供的值是否出现在“Artists”表中。

当 MySQL (InnoDB) 在 "Albums" 中没有在 "ArtistID" 列中找到匹配值的行时,它会抛出外键约束错误。

这就是 MySQL 报告的内容:“艺术家”中没有匹配的行。

要解决此问题,“INSERT INTO Albums”语句必须为“ArtistID”提供有效值。

如果该列允许 NULL 值,我们可以插入一个 NULL。那么这张专辑就不会与艺术家有关。


鉴于代码中显示的语句:

INSERT INTO Albums (AlbumName) VALUES ('something')

“ArtistID”列必须使用除 NULL 之外的 DEFAULT 值来定义,或者存在分配非 NULL 值的 BEFORE INSERT 触发器。

语句大概应该是这样的:

INSERT INTO Albums (AlbumName,ArtistID) VALUES ('something',112)
                             ^^^^^^^^^                     ^^^^

为 ArtistID 列提供有效值。

于 2017-04-25T14:21:04.923 回答