我得到包含我所在國家/地區的郵政編號和地區的資料庫表。該表包含所有資訊,但我需要出于我的目的對其進行更改。
我需要消除在特定列中具有重復內容的所有行。
檢查螢屏截圖以查看結果

我想洗掉所有具有postanski_broj (postal_number) 的重復行。該數字必須是唯一的。我嘗試手動將該列設定為唯一但當我嘗試執行陳述句時出現重復條目??。
- ID 是自動遞增的主鍵。
- postanski_broj 列是代表 postal_code 的 VARCHAR
- naselje 列是代表區域的 VARCHAR
一個地區可以有一個郵政編碼
我試試
ALTER TABLE poste ADD UNIQUE INDEX idx_postanski_br (postanski_broj);
00:03:20 ALTER TABLE poste ADD UNIQUE INDEX idx_postanski_br (postanski_broj) 錯誤代碼:1062. 鍵 'idx_postanski_br' 的重復條目 '11158' 0.118 秒
ALTER IGNORE TABLE poste ADD UNIQUE INDEX idx_postanski_br (postanski_broj);
00:04:17 ALTER IGNORE TABLE poste ADD UNIQUE INDEX idx_postanski_br (postanski_broj) 錯誤代碼:1064。您的 SQL 語法有錯誤;檢查與您的 MySQL 服務器版本相對應的手冊,以在第 1 行 0.00037 秒的“IGNORE TABLE poste ADD UNIQUE INDEX idx_postanski_br (postanski_broj)”附近使用正確的語法
有人有建議嗎?謝謝
uj5u.com熱心網友回復:
如果您有其他列的值與您在此處顯示的值不同(除了id),洗掉應該是您的最后選擇。
我通常會先復制表格:
CREATE TABLE poste_new LIKE poste;
為新創建的poste_new表添加唯一索引:
ALTER TABLE poste_new ADD UNIQUE INDEX idx_postanski_br (postanski_broj);
使用選項將資料插入poste到其中以根據唯一索引跳過重復項:poste_newIGNORE
INSERT IGNORE INTO poste_new SELECT * FROM poste;
重命名表:
RENAME TABLE poste TO poste_old;
RENAME TABLE poste_new TO poste;
這樣做的好處是您已將錯誤洗掉的風險降到最低,如果您對新表不滿意,舊表仍然完好無損 - 有效地將其作為備份。
uj5u.com熱心網友回復:
對于大表,此解決方案可能需要太多時間。解決此問題的最佳方法是:洗掉 MySQL 中的重復行
您必須在應用唯一約束之前洗掉行。小心應用這個:
DELETE p1 FROM poste p1
INNER JOIN poste p2
WHERE
p1.id < p2.id AND
p1.postanski_broj = p2.postanski_broj;
這應該洗掉重復的那些,并只保留那些具有較高 id 的(在您的示例中為 id=168044)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/525237.html
標籤:mysql
