4

ユーザーとロールの間に HABTM 関連付けがあります。

ユーザーは、ロールの管理者 (role_id = 1) またはユーザー (role_id = 2) にすることができます。

結合テーブル、roles_users には、冗長なレコードがいくつかあります。例:

ここに画像の説明を入力

1:1、2:4などの重複レコードを削除したい。

2 つの質問:

  1. 重複を削除する SQL スクリプトを実行するのに最適な場所はどこですか? 移行ですか? 脚本?

  2. 重複を削除するためのSQLクエリは何ですか?

4

2 に答える 2

12
CREATE TABLE roles_users2 LIKE roles_users; -- this ensures indexes are preserved
INSERT INTO roles_users2 SELECT DISTINCT * FROM roles_users; 
DROP TABLE roles_users;
RENAME TABLE roles_users2 TO roles_users;

将来的には、行の重複を防ぐために

ALTER TABLE roles_users ADD UNIQUE INDEX (role_id, user_id);

または、次のコマンドを使用して、すべてを 1 ステップで実行できますALTER TABLE IGNORE

ALTER IGNORE TABLE roles_users ADD UNIQUE INDEX (role_id, user_id);

IGNORE は、標準 SQL に対する MySQL 拡張機能です。新しいテーブルの一意のキーに重複がある場合、または厳密モードが有効になっているときに警告が発生した場合に、ALTER TABLE がどのように機能するかを制御します。IGNORE が指定されていない場合、重複キー エラーが発生すると、コピーは中止され、ロールバックされます。IGNORE が指定されている場合、一意のキーが重複している行の最初の行のみが使用されます。他の競合する行は削除されます。正しくない値は、最も一致する許容値に切り捨てられます。

于 2011-02-13T21:42:26.280 に答える