当前位置: 首页 > 知识库问答 >
问题:

即使存在使用键列的where子句,Delete也失败

戈曾琪
2023-03-14

我是mySQL的新手,在学习连接的同时,我尝试使用左连接、右连接和完全外部连接来创建一个完全连接。然后我意识到我的一个原始表(表t2)有一个空行。

当尝试删除它时,我得到错误:错误代码:1175。您正在使用安全更新模式,并且试图更新一个没有使用键列禁用安全模式的WHERE的表,请在Preferences->SQL Editor中切换该选项并重新连接。

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;
 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命令行时,我没有看到空行,但是当我在Workbench中运行脚本时我看到了它。此外,我更新了我的代码的基础上的答案,但我不能添加图片到现在,因为我是新的,我不允许做添加图片:(,以下是新的代码。

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;

共有1个答案

鲁景山
2023-03-14

只需在查询运行之前使用workbench查询编辑器中的以下代码

SET SQL_SAFE_UPDATES = 0;
 类似资料:
  • 问题内容: 我试图弄清楚如何在MySQL中优化一个非常慢的查询(我没有设计这个): 比较一下: 说明语句对我没有帮助: 好的,它仍然认为它需要大约400万个条目才能计数,但是我可以计算文件中的行数比这还要快!我不明白为什么MySQL要花这么长时间。 这是表的定义: 版: 有什么明显的我想念的东西吗?(是的,我已经尝试过“ SELECT COUNT(change_event_id)”,但是没有性能差

  • 以前很多次,当我尝试在mySQL表中设置/更新/删除某些内容时,它会给出 错误代码: 1175年。您正在使用安全更新模式,并且您尝试更新不使用使用 KEY 列的 WHERE 的表 要禁用安全模式,请切换首选项中的选项 - 我可以通过在where子句中包含一个涉及主键的真实条件来解决这个问题。 但是,为什么以下方法不起作用? LiftID是一个varchar,是主键。 更新:根据Bill Karwi

  • 我在Amazon RDS上的mysql DB8.0.20版本中有两个表,它们之间有一个外键。 当我尝试插入第二个表时,我得到一个外键错误,但我确定第一个表中存在该键。 然后我跑: 那么,如果ID存在于表1中,为什么表2不能在外键列中使用它呢?我错过了什么?

  • 问题内容: 我有这样的查询: 出现以下错误: 在MySql中,这是有效的,但显然在Postgresql中是无效的。据我所知,原因是查询部分的评估晚于该部分。是否有解决此问题的常用解决方法? 问题答案: 正如您所经历的那样,MySQL的支持是非标准的。正确的方法是重新打印SELECT子句中使用的相同表达式:

  • 这很混乱,因为我的where子句确实使用了主键列。我知道我可以禁用安全模式作为我的脚本的一部分作为一个变通办法,但仍然想要理解为什么我会得到这个错误。如果可能的话,我希望避免不安全的更新。

  • 问题内容: 我知道在oracle / mysql / sqlserver语句中,您不能在子句中引用列别名,因为它是在之前执行的,但它在sqlite3中有效: 为什么在sqlite中这有可能? 问题答案: 使用启用了标志的sqlite3 : 从上面的指令堆栈可以看出,行的循环(第8-23行)针对表中的每一行对子句中的每个表达式重复执行and命令。 因此,要回答我自己的问题,sqlite引擎能够通过在