1

こんにちはここで、誤ってテーブルを削除せずに、いくつかの挿入ステートメントで構成されるテーブルのバッチファイルを実行したという状況に遭遇しました。

alert_priorityのようなテーブルがあります。

Id  priority_name
---  --------------
1     P0
2     P1
3     P2

そして今、誤ってalert_priorityを削除せずに、いくつかの挿入ステートメントで構成されるテーブルのスクリプトファイルを実行しました。スクリプトを実行した後、テーブル内のレコードは次のようになります。

Id  priority_name
---  --------------
1     P0
2     P1
3     P2
1     P0
2     P1
3     P2

ここで、余分なレコード(Id 3以降のレコード)を削除したいので、スクリプトファイルを実行する前に存在するすべてのレコードが必要です。

テーブルを削除してスクリプトファイルをもう一度実行するオプションがありますが、SQLクエリ
を介して実行できる方法がありますか?テーブルにprimayキーがありません

4

6 に答える 6

2

まず、IDフィールドをAI(自動インクリメント)、さらにはPK(主キー)として設定することを検討してください。

これらの重複した行を削除するために、新しいテーブルを作成し、それらの重複したすべての行をそのテーブルに移動します。その後、そのテーブルをドロップします。

CREATE TEMPORARY TABLE bad_temp AS SELECT DISTINCT * FROM alert_priority

于 2012-10-15T08:00:59.460 に答える
1

すべての一意のレコードを新しいテーブルにコピーしてから、古いテーブルを削除できます。

SELECT DISTINCT * INTO new_table FROM old_table
于 2012-10-15T08:00:17.167 に答える
1

SQL-ServerではROW_NUMBERを使用するのは簡単ですが、残念ながらMySQLにはそのような関数はありません:-(

それを解決する最良の方法は次のとおりです。

  • 最初のテーブルと構造が同じであるが、データがない新しいテーブルを作成します。
  • クエリを使用します。INSERT INTO name_of_new_table SELECT DISTINCT * FROM name_of_old_table
  • 古いテーブルを削除します
  • 新しいテーブルの名前を、古いテーブルの名前に変更します。
于 2012-10-15T08:01:15.670 に答える
1
CREATE TABLE new_tbl(id int AUTO_INCREMENT,priority_name);

INSERT INTO new_tbl
select priority_name from old_tbl group by priority_name;
于 2012-10-15T08:06:11.303 に答える
0

次のクエリは、保持したいすべてのレコードを提供します。

SELECT min(id)
FROM alert_priority
GROUP BY priority_name
HAVING count(*) > 1
    OR min(id) = max(id)

すべての重複を削除するには、次のクエリを実行します。

DELETE FROM alert_priority
WHERE id NOT IN (
    SELECT min(id)
    FROM alert_priority
    GROUP BY priority_name
    HAVING count(*) > 1
        OR min(id) = max(id)
)
于 2012-10-15T08:30:08.413 に答える
0

重複する新しい行を削除して古い行をそのままにしておくには(行が元の行を参照している他のテーブルがすでに存在すると仮定して):-

DELETE FROM alert_priority
WHERE Id IN (SELECT MaxId
FROM (SELECT priority_name, MAX(Id) AS MaxId, COUNT(Id)  AS CountId
FROM alert_priority
GROUP BY priority_name
HAVING CountId > 1))
于 2012-10-15T08:09:29.243 に答える