mysql - 2个表之间的简单关系

标签 mysql sql database

我这里有一个问题。

我无法将其添加到我的数据库中,因为一个表依赖于另一个表,反之亦然。

所以我明白了

Cannot add foreign key constraint

在我放置的第一个创建表上

如果这两个表都有约束,我该如何添加它们?

    -- User Roles
CREATE TABLE IF NOT EXISTS `user_roles` (
  `user_role_id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(45) NOT NULL,
  `role` varchar(45) NOT NULL,
  PRIMARY KEY (`user_role_id`),
  UNIQUE KEY `uni_username_role` (`role`,`username`),
  UNIQUE KEY `ix_auth_username` (`username`,`role`),
  KEY `fk_username_idx` (`username`),
  CONSTRAINT `fk_username` FOREIGN KEY (`username`) REFERENCES `users` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;

-- Users
CREATE TABLE IF NOT EXISTS `users` (
  `username` varchar(45) NOT NULL,
  `name` varchar(45) DEFAULT NULL,
  `hashedPassword` varchar(500) NOT NULL,
  `enabled` tinyint(1) NOT NULL DEFAULT '1',
  `image` mediumblob,
  `team` int(11) DEFAULT NULL,
  `userRole` int(11) DEFAULT NULL,
  PRIMARY KEY (`username`),
  KEY `fkteam_idx` (`team`),
  KEY `fkrole_idx` (`userRole`),
  CONSTRAINT `fkrole` FOREIGN KEY (`userRole`) REFERENCES `user_roles` (`user_role_id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `fkteam` FOREIGN KEY (`team`) REFERENCES `team` (`idteam`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

最佳答案

为此,您需要使用可延迟约束检查,但遗憾的是 MySQL 并未实现此标准 SQL 功能。

据我所知,只有 Oracle 和 PostgreSQL 支持此功能(可延迟约束)。这些约束在事务结束时检查,而不是在每个单行插入时检查。这可以解决你的问题。

因此,您有两个选择:

  • 切换到 Oracle 或 PostgreSQL(我猜不太可能),或者,
  • 更改表定义以允许外键约束之一接受空值。

在第二种情况下,您会:

  • 插入FK允许为空的表中,得到生成的ID。
  • 使用 ID 插入另一个表。然后,获取第二个生成的ID。
  • 使用第二个 ID 更新第一个表中的 null。
  • 提交。

就是这样。

关于mysql - 2个表之间的简单关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49919802/

相关文章:

mysql - 使用 UPDATE 将行标记为 'used'

mysql - 如何在MySql中获取值的总和

php - 检查用户名是否存在sql和php中的代码

python - 为多个数据库一个一个地运行 alembic 迁移

mysql - 为什么MySQL会出现这种死锁呢?

database - 凤凰加入操作不适用于 hbase

mysql - 如何在sql查询中匹配两个不同的表?

php - 更改 mysql 列名称以与 FPutCSV() 一起使用

mysql - 所有类型的 SQL 连接的解释

mysql - 如何查找 12 月底即将到来的生日?