РЕДАКТИРОВАТЬ: Я попытался вставить INTO от PhpMyAdmin. Я заметил, что если я просто сделаю GenreName и не введу идентификатор, AutoIncrement даст мне идентификатор строки 2147483647:
INSERT INTO Жанры (GenreName)
VALUES (‘testFromPhpmyAdmin’)
Я получил такую ошибку раньше, когда работал непосредственно в базе данных MySQL, но все, что я пытался из этой прошлой ошибки на этой новой, не работает. Я исчерпал столько сообщений StackOverflow об этом, сколько смог, но ни одно из решений не сработало. Я определенно проверил, что идентификатор доступен в обеих таблицах. Кроме того, это работало, когда у меня была просто страница с формой ввода текста для AlbumID и AlbumName, но я хотел избавиться от ввода текста для AlbumID, поскольку он автоматически инкрементирован в БД MySQL, поэтому пользователям не нужно вводить / угадывать новый Я БЫ.
Ошибка: ошибка SQL:
Errno: 1452
Ошибка: невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется (andrew79_601
,Albums
, ОГРАНИЧЕНИЕ Albums_ibfk_2
ИНОСТРАННЫЙ КЛЮЧ (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
Сообщение об ошибке означает, что была предпринята попытка вставить или обновить строку в таблице «Альбомы», а значение, указанное для столбца «ArtistID», недопустимо.
Ограничение внешнего ключа обеспечивает соблюдение правила: значение в столбце «ArtistID» должен соответствовать значение в столбце «ArtistID» таблицы «Исполнители».
художники
ArtistID artist_name
-------- -----------
112 Rush
альбомы
AlbumID ... ArtistID ...
------- --------
2112 112
Если мы попытаемся вставить строку в «Альбомы»
INSERT INTO Albums (..., ArtistID ,...) VALUES (..., 707 ,...)
MySQL собирается проверить, что значение '707'
предоставленный для столбца «ArtistID» появится в таблице «Исполнители».
Когда MySQL (InnoDB) не находит строку в «Альбомах» с соответствующим значением в столбце «ArtistID», он выдает ошибку ограничения внешнего ключа.
Об этом сообщает MySQL: в «Artists» нет подходящей строки.
Чтобы это исправить, оператор «INSERT INTO Albums» должен предоставить допустимое значение «ArtistID».
Если столбец допускает значения NULL, мы можем вставить NULL. Тогда альбом не будет связан с артистом.
Учитывая утверждение, показанное в коде:
INSERT INTO Albums (AlbumName) VALUES ('something')
Столбец ArtistID должен быть определен со значением DEFAULT, отличным от NULL, или существует триггер BEFORE INSERT, который присваивает значение, отличное от NULL.
Заявление должно быть примерно таким:
INSERT INTO Albums (AlbumName,ArtistID) VALUES ('something',112)
^^^^^^^^^ ^^^^
С действительным значением, предоставленным для столбца ArtistID.
Других решений пока нет …