MySQL 无法添加外键约束 - 字符集不匹配

标签 mysql ddl

以下创建语句失败

DROP TABLE IF EXISTS `book` ;
DROP TABLE IF EXISTS `person` ;

CREATE TABLE `person` (
  `name` VARCHAR(30) NOT NULL,
  PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `book` (
  `author` VARCHAR(30) NOT NULL,
  `title` VARCHAR(100) NOT NULL,
  PRIMARY KEY (`author`, `title`),
  FOREIGN KEY (`author`)
    REFERENCES `person` (`name`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION
) ENGINE = InnoDB ;

出现以下错误

ERROR 1215 (HY000): Cannot add foreign key constraint

所有的数据类型和字段名称都是正确的。为什么外键约束失败?

最佳答案

我找到了答案,DEFAULT CHARSET 子句不匹配。第二个创建表语句还需要声明DEFAULT CHARSET

DROP TABLE IF EXISTS `book` ;
DROP TABLE IF EXISTS `person` ;

CREATE TABLE `person` (
  `name` VARCHAR(30) NOT NULL,
  PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `book` (
  `author` VARCHAR(30) NOT NULL,
  `title` VARCHAR(100) NOT NULL,
  PRIMARY KEY (`author`, `title`),
  FOREIGN KEY (`author`)
    REFERENCES `person` (`name`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION
) ENGINE = InnoDB DEFAULT CHARSET=latin1;

关于MySQL 无法添加外键约束 - 字符集不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27695915/

相关文章:

php - 如何从 mysql 结果中选择第一个和最后一个数据行?

php - 将日期字符串转换为完整日期

mysql - 将MySQL建表查询转换为H2语法

Mysql - 如何根据第一个表的 2 列中的值显示第二个表中的列?

mysql - 在 Liquibase 中使用现有数据?

mysql - 如何选择具有最大值的行,与 MYSQL 中的另一列不同

sas - 提取 SQL DESCRIBE TABLE 输出

python - SQLAlchemy:部分指定的关系

mysql - 将字段留空更好还是用空值填充它更好?