首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MYSQL错误1452

问MYSQL错误1452
EN

Stack Overflow用户
提问于 2017-11-19 00:07:20
回答 1查看 200关注 0票数 0

我有一张登记表,它工作得很好,但出于某种原因,它没有添加到数据库中。所以我在phpmyadmin中测试了这个查询,并发现了这个错误。

查询:

代码语言:javascript
复制
INSERT INTO `EMTS`(`name`, `nickname`, `age`, `number`, `city`, `password`, `street`, `building`) 
VALUES ("Alice","Aa","21","414514151","New York","111","main","x")

我不是故意填其他专栏的。在其他数据库中,这不会引起任何问题。

错误:

#1452 -无法添加或更新子行:外键约束失败(mydb.emts,constraint fk_EMTS_shifts1 REFERENCES (shifts_idshifts)引用shifts (idshifts),删除,不对update操作执行操作)

这是emts表:

代码语言:javascript
复制
CREATE TABLE IF NOT EXISTS mydb.EMTS(
idEMTS INT NOT NULL AUTO_INCREMENT,
name VARCHAR(45) NOT NULL,
nickname VARCHAR(45) NOT NULL,
age VARCHAR(45) NOT NULL,
number VARCHAR(45) NOT NULL,
email VARCHAR(45) NOT NULL,
city VARCHAR(255) NOT NULL,
password VARCHAR(45) NOT NULL,
shifts_idshifts INT(45) NOT NULL,
bloodtype_id INT NOT NULL,
street VARCHAR(45) NOT NULL,
building VARCHAR(45) NOT NULL,
  PRIMARY KEY (idEMTS),
  INDEX fk_EMTS_shifts1_idx(shifts_idshifts ASC),
  INDEX fk_EMTS_bloodtype1_idx(bloodtype_id ASC),
  UNIQUE INDEX nickname_UNIQUE(nickname ASC),
  CONSTRAINT fk_EMTS_shifts1
    FOREIGN KEY (shifts_idshifts)
    REFERENCES mydb.shifts(idshifts)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT fk_EMTS_bloodtype1
    FOREIGN KEY (bloodtype_id)
    REFERENCES mydb.bloodtype(id)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

这是血型表:

代码语言:javascript
复制
CREATE TABLE IF NOT EXISTS mydb.bloodtype(
type INT NOT NULL,
id INT NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (id))
ENGINE = InnoDB;

这是班次表:

代码语言:javascript
复制
CREATE TABLE IF NOT EXISTS mydb.shifts(
startdate INT NOT NULL,
enddate VARCHAR(45) NOT NULL,
day VARCHAR(45) NOT NULL,
idshifts INT NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (idshifts))
ENGINE = InnoDB;

我不明白怎么了?

EN

回答 1

Stack Overflow用户

发布于 2017-11-19 00:22:06

我在本地MySQL实例上测试了您的查询。

正如您注意到的,您没有为外键列提供值。但是它们不是空列,而且它们没有默认值。因此,MySQL填充值0。

我通过删除外键约束并再次尝试插入来演示这一点:

代码语言:javascript
复制
mysql> INSERT INTO `EMTS`(`name`, `nickname`, `age`, `number`, `city`, `password`, `street`, `building`) 
    -> VALUES ("Alice","Aa","21","414514151","New York","111","main","x");
Query OK, 1 row affected, 3 warnings (0.02 sec)

mysql> show warnings;
+---------+------+------------------------------------------------------+
| Level   | Code | Message                                              |
+---------+------+------------------------------------------------------+
| Warning | 1364 | Field 'email' doesn't have a default value           |
| Warning | 1364 | Field 'shifts_idshifts' doesn't have a default value |
| Warning | 1364 | Field 'bloodtype_id' doesn't have a default value    |
+---------+------+------------------------------------------------------+
3 rows in set (0.01 sec)

mysql> select * from EMTS;
+--------+-------+----------+-----+-----------+-------+----------+----------+-----------------+--------------+--------+----------+
| idEMTS | name  | nickname | age | number    | email | city     | password | shifts_idshifts | bloodtype_id | street | building |
+--------+-------+----------+-----+-----------+-------+----------+----------+-----------------+--------------+--------+----------+
|      3 | Alice | Aa       | 21  | 414514151 |       | New York | 111      |               0 |            0 | main   | x        |
+--------+-------+----------+-----+-----------+-------+----------+----------+-----------------+--------------+--------+----------+

注意,两个外键列都被赋予了0的值。

如果不希望为外键列提供值,请将它们设置为可空列。NULL存在是可以的,它不会导致外键约束违反。虽然0是一个非空值,但它不存在于所引用的表中,用于轮班和血型。

https://dev.mysql.com/doc/refman/5.7/en/data-type-defaults.html说:

对于没有显式默认子句的NULL列,如果INSERT或REPLACE语句不包含该列的值,或者UPDATE语句将该列设置为NULL,则MySQL根据当时有效的SQL模式处理该列:

  • 如果启用了严格的SQL模式,则事务性表将发生错误并回滚该语句。对于非事务性表,会发生错误,但如果这发生在多行语句的第二行或后续行,则前面的行将被插入。
  • 如果未启用严格模式,则MySQL将列设置为列数据类型的隐式默认值。

整数列的隐式默认值为0。

对于MySQL来说,这是一种奇怪的行为,使许多开发人员感到困惑。如果列不是NULL,那么为什么它允许我们插入NULL,并默认为某些未指定的隐式默认值?这违反了直觉。

因此,在较新版本的MySQL 5.7及更高版本中,已将严格模式设置为默认模式。您也可以自己设置严格的模式:

代码语言:javascript
复制
mysql> SET sql_mode='strict_all_tables';

mysql> INSERT INTO `EMTS`(`name`, `nickname`, `age`, `number`, `city`, `password`, `street`, `building`) 
    -> VALUES ("Alice","Aa","21","414514151","New York","111","main","x");
ERROR 1364 (HY000): Field 'email' doesn't have a default value
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47372443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档