Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql cascade赢得';当尝试更新主键时不起作用,该主键被另一个表中的两列引用为外键_Mysql - Fatal编程技术网

mysql cascade赢得';当尝试更新主键时不起作用,该主键被另一个表中的两列引用为外键

mysql cascade赢得';当尝试更新主键时不起作用,该主键被另一个表中的两列引用为外键,mysql,Mysql,我在更新数据库时遇到问题 这是我的结构: 我有一个名为“users”的表: CREATE TABLE `users` ( `username` varchar(45) NOT NULL, PRIMARY KEY (`username`) ) INSERT INTO `users` VALUES ('alice'),('bob'),('john'); 我有一个名为“订单”的表: CREATE TABLE `orders` ( `user1` varchar(45) NOT NULL

我在更新数据库时遇到问题

这是我的结构:

我有一个名为“users”的表:

CREATE TABLE `users` (
  `username` varchar(45) NOT NULL,
  PRIMARY KEY (`username`)
)

INSERT INTO `users` VALUES ('alice'),('bob'),('john');
我有一个名为“订单”的表:

CREATE TABLE `orders` (
  `user1` varchar(45) NOT NULL,
  `user2` varchar(45) NOT NULL,
  `date` datetime DEFAULT NULL,
  PRIMARY KEY (`user1`,`user2`),
  KEY `user2_idx` (`user2`),
  CONSTRAINT `user1` FOREIGN KEY (`user1`) REFERENCES `users` (`username`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `user2` FOREIGN KEY (`user2`) REFERENCES `users` (`username`) ON DELETE CASCADE ON UPDATE CASCADE
)

INSERT INTO `orders` VALUES ('alice','bob',NULL),('alice','john',NULL),('bob','bob',NULL);
这意味着一个订单由2个用户组成,即“订单”表的记录由引用“用户”表的2个外键组合而成

我遇到的问题是,我现在需要更改用户的用户名

根据上述代码,我有: 3个用户:“爱丽丝”、“鲍勃”和“约翰” 3个顺序:('alice','bob'),('alice','john'),('bob','bob'))

如果我尝试编辑'alice'或'john'用户名,那么操作将成功,级联将相应地更改所有顺序

但是,如果我尝试将“bob”用户名更改为其他用户名,我会收到一条可怕的错误消息,我无法理解为什么:

Operation failed: There was an error while applying the SQL script to the database.
Executing:
UPDATE `test`.`users` SET `username`='bobd' WHERE `username`='bob';

ERROR 1452: 1452: Cannot add or update a child row: a foreign key constraint fails (`test`.`orders`, CONSTRAINT `user2` FOREIGN KEY (`user2`) REFERENCES `users` (`username`) ON DELETE CASCADE ON UPDATE CASCADE)
SQL Statement:
UPDATE `test`.`users` SET `username`='bobd' WHERE `username`='bob'

输入bob,bob是个问题,因为它有两个键(主键、外键)和两个约束(user1、user2)。它们都引用相同的字段users.username。这严重混淆了数据库软件,是糟糕的设计

最简单的解决方案是删除约束,更新表并重新建立约束

在users表中,您应该使用ID,Name和ID上的键。然后在orders表中,使用ID,ID。然后您可以在一个表中更新名称,而不会出现问题


为了有助于数据库设计,您应该阅读第三种范式

我想这条条款已经咬到你的屁股了:

:

在两个表之间,不要定义几个作用于父表或子表中同一列的UPDATE CASCADE子句

如您所见,服务器为级联更新的每个约束发出单独的
UPDATE
语句。但是,如果有两列受影响,则两条语句都不能单独生成有效行

这里一个可能的解决方案是使用用户ID作为其唯一身份,而不是任何辅助信息。

事实上,在任何事情都可能随时间而改变的情况下,这是一个经过时间验证的最佳实践:概述了优点和缺点。

我在使用JPA/Hibernate时遇到了这个问题。DDL更新(hibernate.hbm2ddl.auto=update)创建了重复的外键约束。我删除了原始约束,保留了生成的约束。这解决了我的问题。

您永远不应该更新主键。“删除约束,更新表并重新建立约束”类型的解决方案是生产附近的一个大禁忌(特别是当数据库有任何可能正在使用时)。我正在认真生产