Mysql 在删除时,级联删除额外的行
我有以下表格:Mysql 在删除时,级联删除额外的行,mysql,foreign-keys,cascade,Mysql,Foreign Keys,Cascade,我有以下表格: 创建表工作区( id INT NOT NULL主键自动递增, uid VARCHAR(255), 名称NVARCHAR(255) ); 创建表用户组( id INT NOT NULL主键自动递增, 工作空间ID INT, 外键(工作空间id)在删除级联时引用工作空间(id), 名称NVARCHAR(255) ); 创建表userWorkspaceMapping( id INT NOT NULL主键自动递增, 工作空间ID INT, 外键(工作空间id)在删除级联时引用工作空间(i
创建表工作区(
id INT NOT NULL主键自动递增,
uid VARCHAR(255),
名称NVARCHAR(255)
);
创建表用户组(
id INT NOT NULL主键自动递增,
工作空间ID INT,
外键(工作空间id)在删除级联时引用工作空间(id),
名称NVARCHAR(255)
);
创建表userWorkspaceMapping(
id INT NOT NULL主键自动递增,
工作空间ID INT,
外键(工作空间id)在删除级联时引用工作空间(id),
userId INT,
外键(userId)引用用户(id),
userGroupId INT,
外键(userGroupId)在删除级联上引用userGroup(id)
);
以及用户工作空间映射的以下数据:
+----+-------------+--------+-------------+
| id | workspaceId | userId | userGroupId |
+----+-------------+--------+-------------+
| 1 | 1 | 1 | 1 | <------- I want to delete only this row
| 2 | 2 | 1 | 3 |
| 3 | 3 | 1 | 5 |
+-----------------------------------------+
为什么要删除userWorkspaceMapping
中的所有内容?
这里有一个问题:您的用户组
表还引用了带有ON-DELETE级联约束的工作区
。因此,当您在工作区中删除一行时,在userGroup
中引用该行的所有行都将被删除
mysql> delete from workspace where id = 1;
Query OK, 1 row affected (0.03 sec)
mysql>
mysql> select * from userGroup;
+----+-------------+------+
| id | workspaceId | name |
+----+-------------+------+
| 6 | 2 | b1 |
| 7 | 2 | b2 |
| 8 | 2 | b3 |
| 9 | 2 | b4 |
| 10 | 2 | b5 |
| 11 | 3 | c1 |
| 12 | 3 | c2 |
| 13 | 3 | c3 |
| 14 | 3 | c4 |
| 15 | 3 | c5 |
+----+-------------+------+
这意味着删除组1到5
mysql> delete from workspace where id = 1;
Query OK, 1 row affected (0.03 sec)
mysql>
mysql> select * from userGroup;
+----+-------------+------+
| id | workspaceId | name |
+----+-------------+------+
| 6 | 2 | b1 |
| 7 | 2 | b2 |
| 8 | 2 | b3 |
| 9 | 2 | b4 |
| 10 | 2 | b5 |
| 11 | 3 | c1 |
| 12 | 3 | c2 |
| 13 | 3 | c3 |
| 14 | 3 | c4 |
| 15 | 3 | c5 |
+----+-------------+------+
因此,userWorkspaceMapping
中引用组1到5的所有行都将被删除。这是所有行的原因
级联可以并且确实级联外键引用中的多个“步骤”。级联实际上没有问题。。。我在此处插入了错误的测试ID:
插入到userWorkspaceMapping中(
用户ID,
工作空间ID,
用户组ID
)
价值观
(1, 1, 1),
(1,2,3),--您应该显示外键(userId)引用用户(id),
表和数据。。。非常确定,如果你在所有外键中再输入一次,就会有你的答案。。。使用fiddle创建,例如:你能用fiddle重现问题吗:?给你:我得到了相同的结果,所有3行都被删除了,而不仅仅是一行。@forpas。。。标记用户。。。我看不出来。但是,又一次,是周六晚上……该死的,这不是CASCADE
故障,而是我插入的数据。它的工作如预期,我有错误的ID插入…感谢您的答复!我想出来了。问题不在于级联,而在于我的测试数据,在那里我插入了错误的ID。。。