MySQL“外键约束形成错误”

时间:2017-10-30 11:18:07

标签: 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; 

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

  

“外键约束形成错误”

表Alias和Accounts。

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

我正在使用MariaDB 10.2

我希望有人能告诉我这些陈述有什么问题。

2 个答案:

答案 0 :(得分:1)

您需要将一个键/索引添加到 var bookList = new List<BookViewModel>() { new BookViewModel {Author = "test", Id = Guid.NewGuid(), InStock = 1, Price = 1000, Title = "tes"} }; var httpContextAccessor = new Mock<IHttpContextAccessor>().SetupAllProperties(); httpContextAccessor.Setup(x => x.HttpContext.Session.Get<IEnumerable<BookViewModel>>("test")).Returns(bookList); 表的System.NotSupportedException : Invalid setup on an extension method: x => x.HttpContext.Session.Get<IEnumerable`1>("test") 字段,以便将其用作另一个表的外键。

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

  

CREATE INDEX domain ON domains(domain);

或在创建表时添加索引 -

domain

有关MariaDB this URL

上的外键关键错误的进一步阅读(官方文档)

答案 1 :(得分:0)

定义整数主键。使用它:

CREATE TABLE IF NOT EXISTS `aliases` 
  ( 
     `id`                   INTEGER NOT NULL auto_increment, 
     `source_username`      VARCHAR(255) NOT NULL, 
     `source_domain_id`     INTEGER 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_id`) REFERENCES `domains` (`id`) 
  ) 
engine=innodb;