使用内部查询时mysql错误1175

时间:2017-07-30 16:59:08

标签: mysql

我们说我有两张牌桌 - item_imagesimages

当我运行查询

SELECT image_id FROM item_images WHERE item_id=1

我得到image_id个值56

当我跑步时

DELETE FROM images WHERE id in (5, 6);

它也可以工作并删除这两行。

但是当我尝试将这两个查询链接在一起时,它会因错误1175而失败。

DELETE FROM images WHERE id in (SELECT image_id FROM item_images WHERE item_id=1);

    Error Code: 
1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect. 0.000 sec

id字段设置为私钥,而不是null。

如果WHERE中的id显然是私钥,为什么会发生这种情况?

解决这个问题的唯一方法是禁用安全模式,还是有另一种方式?

谢谢!

1 个答案:

答案 0 :(得分:1)

假设id列(images表)总是大于零(0):

mysql> SET SESSION SQL_SAFE_UPDATES := 1;
Query OK, 0 rows affected (0.00 sec)

mysql> DROP TABLE IF EXISTS `item_images`, `images`;
Query OK, 0 rows affected (0.09 sec)

mysql> CREATE TABLE IF NOT EXISTS `images` (
    ->   `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY
    -> );
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE IF NOT EXISTS `item_images` (
    ->   `item_id` BIGINT UNSIGNED NOT NULL,
    ->   `image_id` BIGINT UNSIGNED NOT NULL
    -> );
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO `images`
    -> VALUES (NULL), (NULL), (NULL),
    ->        (NULL), (NULL), (NULL);
Query OK, 6 rows affected (0.00 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> INSERT INTO `item_images`
    ->   (`item_id`, `image_id`)
    -> VALUES (1, 5), (1, 6), (2, 1),
    ->        (2, 3), (3, 2), (4, 2);
Query OK, 6 rows affected (0.00 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> SELECT `image_id`
    -> FROM `item_images`
    -> WHERE `item_id` = 1;
+----------+
| image_id |
+----------+
|        5 |
|        6 |
+----------+
2 rows in set (0.00 sec)

mysql> DELETE
    -> FROM `images`
    -> WHERE `id` IN (SELECT `image_id`
    ->                FROM `item_images`
    ->                WHERE `item_id` = 1);
ERROR 1175 (HY000): You are using safe update mode and you tried to update
                    a table without a WHERE that uses a KEY column

mysql> DELETE
    -> FROM `images`
    -> WHERE `id` > 0 AND
    ->       `id` IN (SELECT `image_id`
    ->                FROM `item_images`
    ->                WHERE `item_id` = 1);
Query OK, 2 rows affected (0.01 sec)

请参阅db-fiddle

<强>更新

在第一个DELETE中,未达到索引(key)。

mysql> SET SESSION SQL_SAFE_UPDATES := 0;
Query OK, 0 rows affected (0.00 sec)

mysql> EXPLAIN DELETE
    -> FROM `images`
    -> WHERE `id` IN (SELECT `image_id`
    ->                FROM `item_images`
    ->                WHERE `item_id` = 1);
+----+--------------------+-------------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type        | table       | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+--------------------+-------------+------------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | DELETE             | images      | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    6 |   100.00 | Using where |
|  2 | DEPENDENT SUBQUERY | item_images | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    6 |    16.67 | Using where |
+----+--------------------+-------------+------------+------+---------------+------+---------+------+------+----------+-------------+
2 rows in set (0.00 sec)

mysql> EXPLAIN DELETE
    -> FROM `images`
    -> WHERE `id` > 0 AND
    ->       `id` IN (SELECT `image_id`
    ->                FROM `item_images`
    ->                WHERE `item_id` = 1);
+----+--------------------+-------------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+
| id | select_type        | table       | partitions | type  | possible_keys | key     | key_len | ref   | rows | filtered | Extra       |
+----+--------------------+-------------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+
|  1 | DELETE             | images      | NULL       | range | PRIMARY       | PRIMARY | 8       | const |    6 |   100.00 | Using where |
|  2 | DEPENDENT SUBQUERY | item_images | NULL       | ALL   | NULL          | NULL    | NULL    | NULL  |    6 |    16.67 | Using where |
+----+--------------------+-------------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+
2 rows in set (0.01 sec)

请参阅db-fiddle

相关问题