2
locid   country city
39409   US  Aaronsburg
128426  US  Aaronsburg
340356  US  Aaronsburg
429373  US  Aaronsburg
422717  US  Abbeville
431344  US  Abbeville
433062  US  Abbeville
341726  US  Abbeville
421248  US  Abbeville
40779   US  Abbeville
326718  US  Abbeville
317654  US  Abbeville
16707   US  Abbeville
25771   US  Abbeville
120301  US  Abbeville
132115  US  Abbeville
121770  US  Abbeville
130397  US  Abbeville
5585    US  Abbeville
10227   US  Abbeville
190173  US  Abbeville
491120  US  Abbeville
311174  US  Abbeville
306532  US  Abbeville
164271  US  Abbot
465218  US  Abbot
58452   US  Abbotsford
359399  US  Abbotsford
309116  US  Abbotsford
8169    US  Abbotsford

有人可以给我一个 sql 查询来帮助我清理这个表吗?清理 locid(索引)后应该重置,顺便说一句,这是一个使用此查询的县城SELECT locid, country, city FROM location WHERE country = 'US' ORDER BY city ASC。当我通过 phpmyadmin 的导入多次导入一个 sql 文本时,就会出现这个冗余数据,这就是结果,

4

5 回答 5

6

在表位置添加唯一索引,这样就不会插入重复的记录

ALTER IGNORE TABLE location ADD UNIQUE KEY ix1(country, city);

这将自动从表中删除重复记录,并且对于将来的插入查询,您需要使用INSERT IGNORE子句以避免出现重复错误。

但正如@AD7six评论中所建议的,它可能不适用于 MySQL 版本5.1.41,5.5.1-m2, 6.0:请参阅此处的错误

或使用DELETE查询删除重复项的替代安全方法:

DELETE a
FROM location a
     LEFT JOIN (
                SELECT locid
                FROM location
                GROUP BY country, city
               )b
               ON a.locid = b.locid
WHERE b.locid IS NULL;

要重新设置auto_incrementcolumn的值locid,您只需删除primary keyonlocid并重新创建它:

ALTER TABLE location DROP column locid;
ALTER TABLE location 
      ADD COLUMN locid INT unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;

或重新设置locid使用UPDATE查询值的替代方法:

SET var_locid = 0;

UPDATE location
SET locid = (@var_locid := @var_locid + 1)
ORDER BY locid ASC;
于 2012-07-19T09:28:45.727 回答
4

您可以通过几个(每个简单的)步骤来完成此操作。

备份您的原始表格

如果您还没有 - 备份您的原始表格数据。

创建临时表

创建一个新表,您将用它来替换原始表。这是一个例子:

CREATE TABLE temporary (
  locid INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  country VARCHAR(255) DEFAULT '',
  city VARCHAR(255) DEFAULT '',
  PRIMARY KEY  (locid),
  UNIQUE KEY  (country, city)
);

架构应该与您现有的表几乎相同,值得注意的区别是:

  • 自动递增主键
  • 独特的国家+城市索引

导入旧数据

INSERT IGNORE INTO temporary (country, city) SELECT country, city FROM original_table_name;

这将使用独特的国家+城市组合填充您的临时表。每行将被分配一个自动增量值 - 即它将从 1 开始。

检查结果

查看您的数据并确保它看起来像您想要的那样:

SELECT * FROM temporary;

如果有任何问题 - 删除表temporary调整您正在运行的 sql 并重新开始。

用新表替换原来的表

一旦您对您在temporary表格中看到的内容感到满意:

DROP TABLE original_table_name; -- Or rename it to something else
RENAME TABLE temporary TO original_table_name;

您现在有一个表,其中包含唯一数据和从 1 开始的顺序 ID。

其他选项

您也可以将唯一索引应用于国家+城市,删除主键字段,然后将其重新添加为自动增量。请注意,mysql 在创建索引时可能会忽略忽略标志,尽管有一种解决方法

我个人会这样做,但如果您对 sql 没有信心 - 一次只做一件事情,并且在此过程中不破坏您的源数据,可以使更新您的架构成为一项不那么令人担忧的任务。

于 2012-07-19T09:54:58.480 回答
1

删除这些记录

select T2.* from ( 
     select country city,max(locid)locid
     from <table>
     group by country city)T1
     join
     select * from <table> T2
     where T2.locid<>T1.locid
于 2012-07-19T09:38:20.683 回答
0

使用新的 auto_increment 字段创建一个新表,然后使用 GROUP BY 将它们选择到新表中

未经测试,但应如下所示:

INSERT INTO new_table(country, city) 
SELECT country, city FROM old_table 
GROUP BY country,city

编辑:您可以删除 old_table 并在之后重命名 new_table。

于 2012-07-19T09:34:09.730 回答
0
  1. 选择唯一记录并插入到相同架构的另一个临时表中。
  2. 从他的桌子上删除所有东西
  3. 从临时表中选择并重新插入。
  4. 删除临时表
于 2012-07-19T09:34:33.963 回答