【问题标题】:Error Code: 1452 on UPDATE MySQL错误代码:更新 MySQL 上的 1452
【发布时间】:2017-02-20 10:16:36
【问题描述】:

我遇到了一个让我发疯的问题。我在互联网上搜索,但我能找到的是:没有插入外键引用的数据。嗯,我检查了 100 次,它们被插入了。

我的桌子是:

震惊:

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
);

插入的数据:

我的更新查询如下所示:

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;

输出是我想要更新的一条记录。我也问过我的老师这个错误,她也不知道。

【问题讨论】:

  • 先删除约束再更新,更新后创建约束
  • @SinghKailash 如果在进行更改之前将其删除,那么有什么意义呢?更不用说在大表上删除和重新创建约束可能需要相当多的时间。所以,这是一个非常糟糕甚至有害的建议!
  • 也许你在那个表上有触发器并且它在更新时改变了一些值?否则这个错误没有任何意义。
  • 它与问题并不严格相关,但我不会在外键中使用开始和结束时间。我会在Lehrerzeiten 表中添加一个自动递增字段来标识每节课,将其设为PK,并在Stundenanfrage 表的外键中引用此键。
  • 1.将所有记录转移到 Temp_table。然后截断原始表。 2. temp_table 更新记录。 3. 将所有记录从 Temp_table 转移到原始表。 “未找到其他解决方案,因为字段在您更新记录时会影响外键”

标签: mysql sql mysql-workbench


【解决方案1】:

查看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

试试:

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)

【讨论】:

  • 好地方!我感觉这是由于时间戳,但我无法理解它
  • 非常感谢!!我不知道这是默认的。现在可以了。
  • @SebastianP。这样做是因为它从等式中删除了时间戳:)
猜你喜欢
  • 2016-02-17
  • 1970-01-01
  • 2014-04-08
  • 2014-12-16
  • 2014-10-23
  • 1970-01-01
  • 2014-03-31
  • 2021-12-28
  • 1970-01-01
相关资源
最近更新 更多