即使存在使用键列的where子句,删除操作也会失败

时间:2018-07-30 06:10:47

标签: mysql sql mysql-workbench

我是mySQL的新手,在学习联接时,我尝试使用左联接,右联接和完全外联接进行完全联接。然后我意识到我的原始表之一(表t2)有一个空行。

当尝试将其删除时,我收到错误消息:错误代码:1175。您正在使用安全更新模式,并且尝试更新不带有使用KEY列的WHERE的表。要禁用安全模式,请在“首选项”中切换选项- > SQL编辑器并重新连接。

我运行的代码是:

create table t1( c1 integer, c2 integer, c3  varchar (10));
create table t2( c1 integer, c2 integer, c3 varchar(10));

insert into t1 values ( 1, 2, "foo"), (2,3, "bar"),(3,8,"random");
insert into t2 values ( 1, 4, "jack"), (2,6,"jill"), (4,9,"hill");
alter table t2 add primary key (c1);
update  t2 set c1 = 3 where c1 = 4; 
delete from t2 where c1 is null;
select * from t1;
select * from t2;
select * from t1 left join t2 on t1.c1=t2.c1 
union
select * from t1 right join t2 on t1.c1=t2.c1;

以及不带

的MySQL Workbench v8.0中的输出
 delete from t2 where c1 is null;

是这样的:

t1
+------+------+--------+
| c1   | c2   | c3     |
+------+------+--------+
|    1 |    2 | foo    |
|    2 |    3 | bar    |
|    3 |    8 | random |
+------+------+--------+

t2
+----+------+------+
| c1 | c2   | c3   |
+----+------+------+
|  1 |    4 | jack |
|  2 |    6 | jill |
|  3 |    9 | hill |
|NULL| NULL | NULL |
+----+------+------+

t1 union t2
+------+------+--------+------+------+------+
| c1   | c2   | c3     | c1   | c2   | c3   |
+------+------+--------+------+------+------+
|    1 |    2 | foo    |    1 |    4 | jack |
|    2 |    3 | bar    |    2 |    6 | jill |
|    3 |    8 | random |    3 |    9 | hill |
+------+------+--------+------+------+------+

这是错误还是我的代码有问题?我该如何解决? 感谢所有输入。谢谢

更新:当我使用MySQL命令行时,没有看到空行,但是在工作台中运行脚本时看到了它。我也根据答案更新了代码,但由于我是新手,所以我现在无法添加图片,因为我是不可以添加图片的:-(,以下是新代码。

create table t1( c1 integer, c2 integer, c3  varchar (10), primary key(c1));
create table t2( c1 integer, c2 integer, c3 varchar(10),primary key (c1));

insert into t1 values ( 1, 2, "foo"), (2,3, "bar"),(3,8,"random");
insert into t2 values ( 1, 4, "jack"), (2,6,"jill"), (4,9,"hill");
/*alter table t2 add primary key (c1);*/
update  t2 set c1 = 3 where c1 = 4; 
delete from t2 where c1 is null;
select * from t1;
select * from t2;
select * from t1 left join t2 on t1.c1=t2.c1 
union
select * from t1 right join t2 on t1.c1=t2.c1;

2 个答案:

答案 0 :(得分:0)

在工作台查询编辑器中的代码运行以下查询之前仅使用

SET SQL_SAFE_UPDATES = 0;

答案 1 :(得分:0)

最后找到一个答案,好像当我们为一个表添加主键时,工作台在末尾添加了这个空行,而实际上这并不是表的一部分。但是我们可以双击该NULL来手动将值输入表中。

我不确定为什么会收到错误:错误代码:1175。您正在使用安全更新模式,并且尝试在没有使用KEY列的WHERE的情况下更新表。要禁用安全模式,请在首选项-> SQL编辑器,然后重新连接。

但是我可以删除其他任何行。 就像当我使用delete from t2 where c1 = 3;时一样。

我的期望是delete from t2 where c1 is null;也应该工作,除了它不应该对表进行任何更改,但它应该已经执行且没有错误。一旦知道这一点,我就会发布。