SQL错误1452仅在使用auto_increment

时间:2017-04-25 00:49:58

标签: php mysql foreign-keys mysql-error-1452

编辑:我尝试从PhpMyAdmin进行INSERT INTO。我注意到如果我只是做GenreName并且没有输入ID,AutoIncrement给我的行ID为2147483647:     插入流派(GenreName)     价值观(' testFromPhpmyAdmin')

我在直接在MySQL数据库中工作之前遇到了这样的错误,但是我从那个新错误中尝试过的所有错误都没有用。我已经尽可能多地使用StackOverflow关于此的帖子,但是没有一个解决方案最终起作用。我肯定检查过两个表中都有ID。此外,当我让页面只有一个带有AlbumID和AlbumName的文本输入的表单时,它有用,但我想删掉AlbumID的文本条目,因为它在MySQL数据库中自动增加,因此用户不必输入/猜测新的ID。

错误:SQL错误: Errno:1452 错误:无法添加或更新子行:外键约束失败(andrew79_601Albums,CONSTRAINT Albums_ibfk_2 FOREIGN KEY(ArtistID)参考ArtistsArtistID))

当我在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

1 个答案:

答案 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列提供有效值。