2017-02-20 19 views
2

У меня проблема, которая сводит меня с ума. Я искал в Интернете, но все, что я мог найти, было: данные, на которые ссылается внешний ключ, не вставлены. Ну, я проверил его как 100 раз, они вставлены.Код ошибки: 1452 в UPDATE MySQL

Мои таблицы:

Stundenanfrage:

CREATE TABLE IF NOT EXISTS Stundenanfrage(
LehrerKuerzel CHAR(10), 
Anfangszeit TIMESTAMP, 
Endzeit TIMESTAMP, 
StundeGehalten TINYINT, 
Akzeptiert TINYINT, 
Lernprozess TEXT, 
Sterne INT, -- 1-5 1 schlecht; 5 gut 
BetrauNr INT REFERENCES ILB_Betrauung(BetrauNr), 
PRIMARY KEY(LehrerKuerzel, Anfangszeit, Endzeit, BetrauNr), 
FOREIGN KEY(LehrerKuerzel, Anfangszeit, Endzeit) REFERENCES Lehrerzeiten(LehrerKuerzel, Anfangszeit, Endzeit) 
); 

Lehrerzeiten:

CREATE TABLE IF NOT EXISTS Lehrerzeiten(
LehrerKuerzel CHAR(10) REFERENCES ILB_Lehrer, 
Anfangszeit TIMESTAMP , 
Endzeit TIMESTAMP , 
Einzelunterricht TINYINT(1) DEFAULT 0, 
Thema VARCHAR(100), 
PRIMARY KEY(LehrerKuerzel, Anfangszeit, Endzeit) 
); 

И ilb_betrauung:

CREATE TABLE IF NOT EXISTS ILB_Betrauung(
BetrauNr INT PRIMARY KEY AUTO_INCREMENT, 
LehrerKuerzel CHAR(10) REFERENCES ilb_lehrer, 
MatNr CHAR(20) REFERENCES fw_schueler, 
zweckmaeßig_erachtet_Lehrer TINYINT, 
zweckmaeßig_erachtet_Schueler TINYINT, 
Betrauung_AV TINYINT, 
Eltern_informiert TINYINT 
); 

Введенный данные:

Inserts

Мой запрос на обновление выглядит следующим образом:

UPDATE stundenanfrage SET Akzeptiert = 1 
WHERE LehrerKuerzel = "bb" AND Anfangszeit = "2017-02-20 12:20:00" AND 
Endzeit = "2017-02-20 13:00:00"; 

и бросил ошибку:

Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails (`db_ilb`.`stundenanfrage`, CONSTRAINT `stundenanfrage_ibfk_1` FOREIGN KEY (`LehrerKuerzel`, `Anfangszeit`, `Endzeit`) REFERENCES `lehrerzeiten` (`LehrerKuerzel`, `Anfangszeit`, `Endzeit`) 

Я также присоединился все таблицы и выбранные, что конкретная запись я хотел обновить:

SELECT * FROM stundenanfrage s 
JOIN lehrerzeiten l ON s.Lehrerkuerzel = l.Lehrerkuerzel AND s.Anfangszeit = 
l.Anfangszeit AND s.Endzeit = l.Endzeit 
WHERE l.LehrerKuerzel = "bb" AND l.Anfangszeit = "2017-02-20 12:20:00" AND 
l.Endzeit = "2017-02-20 13:00:00" AND s.BetrauNr = 1; 

Вывод был тем, что одна запись я хотел обновить. Я также спросил своего учителя об этой ошибке, и она тоже не знала.

+0

Снимите ограничение первого затем обновить, после обновления создать ограничение –

+0

@SinghKailash какой смысл иметь ограничение, если вы удалите его, прежде чем сделать изменения? Не говоря уже о том, что на большой таблице удаление и воссоздание ограничения может занять довольно много времени. Итак, это очень плохое, даже вредное предложение! – Shadow

+2

Возможно, у вас есть триггер на этой таблице, и он меняет некоторые значения при обновлении? Эта ошибка не имеет смысла. –

ответ

2

Extra Проверить:

mysql> DESC `Stundenanfrage`; 
+----------------+------------+------+-----+-------------------+-----------------------------+ 
| Field   | Type  | Null | Key | Default   | Extra      | 
+----------------+------------+------+-----+-------------------+-----------------------------+ 
| LehrerKuerzel | char(10) | NO | PRI | NULL    |        | 
| Anfangszeit | timestamp | NO | PRI | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | 
| Endzeit  | timestamp | NO | PRI | NULL    |        | 
| StundeGehalten | tinyint(4) | YES |  | NULL    |        | 
| Akzeptiert  | tinyint(4) | YES |  | NULL    |        | 
| Lernprozess | text  | YES |  | NULL    |        | 
| Sterne   | int(11) | YES |  | NULL    |        | 
| BetrauNr  | int(11) | NO | PRI | NULL    |        | 
+----------------+------------+------+-----+-------------------+-----------------------------+ 
8 rows in set (0.00 sec) 

См: 12.3.5 Automatic Initialization and Updating for TIMESTAMP and DATETIME.

Try:

CREATE TABLE IF NOT EXISTS Stundenanfrage (
    LehrerKuerzel CHAR(10), 
    Anfangszeit TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
    Endzeit TIMESTAMP, 
    StundeGehalten TINYINT, 
    Akzeptiert TINYINT, 
    Lernprozess TEXT, 
    Sterne INT, -- 1-5 1 schlecht; 5 gut 
    BetrauNr INT REFERENCES ILB_Betrauung(BetrauNr), 
    PRIMARY KEY(LehrerKuerzel, Anfangszeit, Endzeit, BetrauNr), 
    FOREIGN KEY(LehrerKuerzel, Anfangszeit, Endzeit) 
    REFERENCES Lehrerzeiten(LehrerKuerzel, Anfangszeit, Endzeit) 
); 

mysql> DESC `Stundenanfrage`; 
+----------------+------------+------+-----+-------------------+-------+ 
| Field   | Type  | Null | Key | Default   | Extra | 
+----------------+------------+------+-----+-------------------+-------+ 
| LehrerKuerzel | char(10) | NO | PRI | NULL    |  | 
| Anfangszeit | timestamp | NO | PRI | CURRENT_TIMESTAMP |  | 
| Endzeit  | timestamp | NO | PRI | NULL    |  | 
| StundeGehalten | tinyint(4) | YES |  | NULL    |  | 
| Akzeptiert  | tinyint(4) | YES |  | NULL    |  | 
| Lernprozess | text  | YES |  | NULL    |  | 
| Sterne   | int(11) | YES |  | NULL    |  | 
| BetrauNr  | int(11) | NO | PRI | NULL    |  | 
+----------------+------------+------+-----+-------------------+-------+ 
8 rows in set (0.00 sec) 
+0

Хорошее место! У меня было ощущение, что это произошло из-за временных меток, но я не мог оторвать его от головы – Shadow

+0

Большое спасибо! Я не знал, что это по умолчанию. Он работает сейчас. –

+0

Также спасибо @ Shadow. Ваше предложение тоже работало. –