两个表之间的简单关系

0qx6xfy6  于 2021-06-25  发布在  Mysql
关注(0)|答案(1)|浏览(284)

我这里有个问题。
我不能把它添加到我的数据库中,因为一个表依赖于另一个表,反之亦然。
所以我明白了
无法添加外键约束
在我放置的第一个create表上
如果这两个表都有约束条件,如何添加它们??

-- 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;
4smxwvx5

4smxwvx51#

为此,您需要使用可延迟的约束检查,但不幸的是mysql没有实现这个标准sql特性。
据我所知,只有oracle和postgresql支持这个特性(延迟约束)。这些约束将在事务结束时检查,而不是在每次插入行时检查。那会解决你的问题。
因此,您有两种选择:
切换到oracle或postgresql(我猜不太可能)或者,
更改表定义以允许其中一个外键约束接受空值。
在第二种情况下,您将:
在fk中允许null的表中插入,获取生成的id。
使用id插入到另一个表中。然后,获取第二个生成的id。
使用第二个id更新第一个表中的null。
承诺。
就这样。

相关问题