无法从MySQL中删除行

5
我有一张表格,无法删除行。具体来说,当我试图删除任何一个GEO_SHAPE_ID超过150000000的行时,它就不会从数据库中消失。
我已经尝试过:
1. 使用SQLyog进行删除操作。 2. DELETE FROM TABLE WHERE GEO_SHAPE_ID = 150000042 (0 rows affected)。 3. UNLOCK TABLES 然后执行第2步。
据我所知,bigint是auto_increment的有效候选项。有人知道可能出了什么问题吗? 无论我执行以上哪种操作并刷新表格列表,该行都会重新出现。 你必须帮助我们,医生。我们什么都试过了,但想不出更好的办法!
DJS.
编辑:根据Daniel Vassallo的建议:
mysql> SELECT * FROM `GEO_SHAPE` WHERE GEO_SHAPE_ID = 150000042;
Empty set (0.01 sec)

答案:在发现MySQL中的“check”和“repair”命令后,我发现了一些损坏的键,修复它们之后就可以工作了。

PS. 这里是表结构和一些示例数据,只是为了好玩。

CREATE TABLE `GEO_SHAPE` (
  `GEO_SHAPE_ID` bigint(11) NOT NULL auto_increment,
  `RADIUS` float default '0',
  `LATITUDE` float default '0',
  `LONGITUDE` float default '0',
  `SHAPE_TYPE` enum('Custom','Region') default NULL,
  `PARENT_ID` int(11) default NULL,
  `SHAPE_POLYGON` polygon default NULL,
  `SHAPE_TITLE` varchar(45) default NULL,
  `SHAPE_ABBREVIATION` varchar(45) default NULL,
  PRIMARY KEY  (`GEO_SHAPE_ID`)
) ENGINE=MyISAM AUTO_INCREMENT=150000056 DEFAULT CHARSET=latin1 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC;

SET FOREIGN_KEY_CHECKS = 0;

LOCK TABLES `GEO_SHAPE` WRITE;
INSERT INTO `GEO_SHAPE` (`GEO_SHAPE_ID`, `RADIUS`, `LATITUDE`, `LONGITUDE`, `SHAPE_TYPE`, `PARENT_ID`, `SHAPE_POLYGON`, `SHAPE_TITLE`, `SHAPE_ABBREVIATION`) VALUES (57, NULL, NULL, NULL, 'Region', 10, NULL, 'Washington', 'WA');
INSERT INTO `GEO_SHAPE` (`GEO_SHAPE_ID`, `RADIUS`, `LATITUDE`, `LONGITUDE`, `SHAPE_TYPE`, `PARENT_ID`, `SHAPE_POLYGON`, `SHAPE_TITLE`, `SHAPE_ABBREVIATION`) VALUES (58, NULL, NULL, NULL, 'Region', 10, NULL, 'West Virginia', 'WV');
INSERT INTO `GEO_SHAPE` (`GEO_SHAPE_ID`, `RADIUS`, `LATITUDE`, `LONGITUDE`, `SHAPE_TYPE`, `PARENT_ID`, `SHAPE_POLYGON`, `SHAPE_TITLE`, `SHAPE_ABBREVIATION`) VALUES (59, NULL, NULL, NULL, 'Region', 10, NULL, 'Wisconsin', 'WI');
INSERT INTO `GEO_SHAPE` (`GEO_SHAPE_ID`, `RADIUS`, `LATITUDE`, `LONGITUDE`, `SHAPE_TYPE`, `PARENT_ID`, `SHAPE_POLYGON`, `SHAPE_TITLE`, `SHAPE_ABBREVIATION`) VALUES (150000042, 10, -33.8833, 151.217, 'Custom', NULL, NULL, 'Sydney%2C%20New%20South%20Wales%20%2810km%20r', NULL);
INSERT INTO `GEO_SHAPE` (`GEO_SHAPE_ID`, `RADIUS`, `LATITUDE`, `LONGITUDE`, `SHAPE_TYPE`, `PARENT_ID`, `SHAPE_POLYGON`, `SHAPE_TITLE`, `SHAPE_ABBREVIATION`) VALUES (150000043, 10, -33.8833, 151.167, 'Custom', NULL, NULL, 'Annandale%2C%20New%20South%20Wales%20%2810km%', NULL);
INSERT INTO `GEO_SHAPE` (`GEO_SHAPE_ID`, `RADIUS`, `LATITUDE`, `LONGITUDE`, `SHAPE_TYPE`, `PARENT_ID`, `SHAPE_POLYGON`, `SHAPE_TITLE`, `SHAPE_ABBREVIATION`) VALUES (150000048, 10, -27.5, 153.017, 'Custom', NULL, NULL, 'Brisbane%2C%20Queensland%20%2810km%20radius%2', NULL);
INSERT INTO `GEO_SHAPE` (`GEO_SHAPE_ID`, `RADIUS`, `LATITUDE`, `LONGITUDE`, `SHAPE_TYPE`, `PARENT_ID`, `SHAPE_POLYGON`, `SHAPE_TITLE`, `SHAPE_ABBREVIATION`) VALUES (150000045, 10, 43.1002, -75.2956, 'Custom', NULL, NULL, 'New%20York%20Mills%2C%20New%20York%20%2810km%', NULL);
INSERT INTO `GEO_SHAPE` (`GEO_SHAPE_ID`, `RADIUS`, `LATITUDE`, `LONGITUDE`, `SHAPE_TYPE`, `PARENT_ID`, `SHAPE_POLYGON`, `SHAPE_TITLE`, `SHAPE_ABBREVIATION`) VALUES (150000046, 10, 40.1117, -78.9258, 'Custom', NULL, NULL, 'Region1', NULL);
UNLOCK TABLES;

SET FOREIGN_KEY_CHECKS = 1;
3个回答

4

转到Sequel Pro右上角的控制台。右键单击未能运行的命令并复制它。

将其粘贴到Sequel Pro顶部的查询部分,并手动运行它。

这将允许您查看阻止删除行的错误并进行修复。


谢谢!帮我找到了一个阻止删除的外键约束。 - Michael Scott Asato Cuthbert

3

我用你的数据试了一下,结果和预期一样:

DELETE FROM `GEO_SHAPE` WHERE GEO_SHAPE_ID = 150000042;
-- Query OK, 1 row affected (0.00 sec)

结果:

+--------------+--------+----------+-----------+------------+-----------+---------------+-----------------------------------------------+--------------------+
| GEO_SHAPE_ID | RADIUS | LATITUDE | LONGITUDE | SHAPE_TYPE | PARENT_ID | SHAPE_POLYGON | SHAPE_TITLE                                   | SHAPE_ABBREVIATION |
+--------------+--------+----------+-----------+------------+-----------+---------------+-----------------------------------------------+--------------------+
|           57 |   NULL |     NULL |      NULL | Region     |        10 | NULL          | Washington                                    | WA                 | 
|           58 |   NULL |     NULL |      NULL | Region     |        10 | NULL          | West Virginia                                 | WV                 | 
|           59 |   NULL |     NULL |      NULL | Region     |        10 | NULL          | Wisconsin                                     | WI                 | 
|    150000043 |     10 | -33.8833 |   151.167 | Custom     |      NULL | NULL          | Annandale%2C%20New%20South%20Wales%20%2810km% | NULL               | 
|    150000048 |     10 |    -27.5 |   153.017 | Custom     |      NULL | NULL          | Brisbane%2C%20Queensland%20%2810km%20radius%2 | NULL               | 
|    150000045 |     10 |  43.1002 |  -75.2956 | Custom     |      NULL | NULL          | New%20York%20Mills%2C%20New%20York%20%2810km% | NULL               | 
|    150000046 |     10 |  40.1117 |  -78.9258 | Custom     |      NULL | NULL          | Region1                                       | NULL               | 
+--------------+--------+----------+-----------+------------+-----------+---------------+-----------------------------------------------+--------------------+

你尝试过以下方法吗:

SELECT * FROM `GEO_SHAPE` WHERE GEO_SHAPE_ID = 150000042;

@Wilhelm:嘿嘿,没错...我的意图是要表明问题似乎出在其他地方,因为这应该按预期工作。 - Daniel Vassallo
啊哈!有线索了... mysql> SELECT * FROM GEO_SHAPE WHERE GEO_SHAPE_ID = 150000042; 空集 (0.01 秒) - Drew

3

问题是数据表已经损坏。我使用'CHECK TABLE GEO_SHAPE;' 命令进行检查,并使用 'REPAIR TABLE GEO_SHAPE;' 命令修复了该表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接