MySQL "Foreign key constraint is incorrectly formed"

标签 mysql sql foreign-keys mariadb sequelize.js

我有以下 SQL 命令:

CREATE TABLE IF NOT EXISTS `users` 
  ( 
     `id`        INTEGER NOT NULL auto_increment, 
     `username`  VARCHAR(255) NOT NULL UNIQUE, 
     `password`  VARCHAR(255) NOT NULL, 
     `root`      TINYINT(1) DEFAULT 0, 
     `createdat` DATETIME NOT NULL, 
     `updatedat` DATETIME NOT NULL, 
     UNIQUE `username_unique` (`username`), 
     PRIMARY KEY (`id`) 
  ) 
engine=innodb; 

CREATE TABLE IF NOT EXISTS `domains` 
  ( 
     `id`        INTEGER NOT NULL auto_increment, 
     `domain`    VARCHAR(255) NOT NULL UNIQUE, 
     `createdat` DATETIME NOT NULL, 
     `updatedat` DATETIME NOT NULL, 
     `userid`    INTEGER, 
     UNIQUE `domain_unique` (`domain`), 
     PRIMARY KEY (`id`), 
     FOREIGN KEY (`userid`) REFERENCES `users` (`id`) ON DELETE SET NULL ON 
     UPDATE CASCADE 
  ) 
engine=innodb; 

CREATE TABLE IF NOT EXISTS `aliases` 
  ( 
     `id`                   INTEGER NOT NULL auto_increment, 
     `source_username`      VARCHAR(255) NOT NULL, 
     `source_domain`        VARCHAR(255) NOT NULL, 
     `destination_username` VARCHAR(255) NOT NULL, 
     `destination_domain`   VARCHAR(255) NOT NULL, 
     `enabled`              TINYINT(1) NOT NULL DEFAULT 1, 
     `createdat`            DATETIME NOT NULL, 
     `updatedat`            DATETIME NOT NULL, 
     PRIMARY KEY (`id`), 
     FOREIGN KEY (`source_domain`) REFERENCES `domains` (`domain`) 
  ) 
engine=innodb; 

CREATE TABLE IF NOT EXISTS `accounts` 
  ( 
     `id`        INTEGER NOT NULL auto_increment, 
     `username`  VARCHAR(255) NOT NULL, 
     `domain`    VARCHAR(255) NOT NULL, 
     `password`  VARCHAR(255) NOT NULL, 
     `quota`     INTEGER NOT NULL DEFAULT 500, 
     `enabled`   TINYINT(1) NOT NULL DEFAULT 1, 
     `sendonly`  TINYINT(1) NOT NULL DEFAULT 0, 
     `createdat` DATETIME NOT NULL, 
     `updatedat` DATETIME NOT NULL, 
     PRIMARY KEY (`id`), 
     FOREIGN KEY (`domain`) REFERENCES `domains` (`domain`) 
  ) 
engine=innodb; 

如果我尝试运行这些,我会收到消息:

"Foreign key constraint is incorrectly formed"

对于表“别名”和“帐户”。

无法在别名和帐户中使用主键

我正在使用 MariaDB 10.2

我希望有人能告诉我这些说法有什么问题。

最佳答案

您需要将键/索引添加到domains表的domain字段,以便它可以被另一个表用作外键。

如果表已创建并且您想要添加索引,请使用此。

CREATE INDEX domain ON domains(domain);

或者在创建表时添加索引 -

CREATE TABLE IF NOT EXISTS `domains` 
  ( 
     `id`        INTEGER NOT NULL auto_increment, 
     `domain`    VARCHAR(255) NOT NULL UNIQUE, 
     `createdat` DATETIME NOT NULL, 
     `updatedat` DATETIME NOT NULL, 
     `userid`    INTEGER, 
     UNIQUE `domain_unique` (`domain`), 
     PRIMARY KEY (`id`), 
     INDEX domain (domain),
     FOREIGN KEY (`userid`) REFERENCES `users` (`id`) ON DELETE SET NULL ON 
     UPDATE CASCADE 
  ) 
engine=innodb; 

有关 MariaDB 上的外键约束错误的进一步阅读(官方文档)this URL

关于MySQL "Foreign key constraint is incorrectly formed",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47013953/

相关文章:

sql - 通过窗口函数获取第一个时间戳

c# - ASP.NET - 使用字符串 ID 和 2 个键查询表

php - PDO rowCount 仅返回 1

python - 在Python中读取分隔文本文件

mysql - 出于用户授权目的,如何处理数据库中的大量记录存储?

SQL SELECT FROM ... AS 与数据类型说明符?

MYSQL: ALTER TABLE DROP FOREIGN KEY 基于 SELECT 结果

mysql - 计划在从xml文件导入数据时在MySQL中创建关系表

mysql - while循环中的查询集django

mysql - 在 OS X 的命令行中使用 MySQL - 找不到命令?