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文本时出现这个冗余数据,这就是结果,
答案 0 :(得分:6)
在表位置添加唯一索引,以便不会插入重复记录
ALTER IGNORE TABLE location ADD UNIQUE KEY ix1(country, city);
这将自动从表中删除重复记录,并且对于将来的插入查询,您需要使用INSERT IGNORE
子句以避免出现重复错误。
但正如@AD7six
在评论中所建议的那样,它可能不适用于MySQL版本5.1.41,5.5.1-m2, 6.0
:请参阅错误here
或使用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_increment
列locid
的值,您只需将primary key
放在locid
上并重新创建它:
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;
答案 1 :(得分: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 may ignore the ignore flag when creating indexes ,但有workaround for that。
我个人这样做,但是如果你对sql没有信心 - 一次一步做事,并且在这个过程中没有破坏你的源数据,可以让你的架构更新不那么令人担心任务。
答案 2 :(得分: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
答案 3 :(得分: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。
答案 4 :(得分:0)