ユーザーとロールの間に HABTM 関連付けがあります。
ユーザーは、ロールの管理者 (role_id = 1) またはユーザー (role_id = 2) にすることができます。
結合テーブル、roles_users には、冗長なレコードがいくつかあります。例:
1:1、2:4などの重複レコードを削除したい。
2 つの質問:
重複を削除する SQL スクリプトを実行するのに最適な場所はどこですか? 移行ですか? 脚本?
重複を削除するためのSQLクエリは何ですか?
ユーザーとロールの間に HABTM 関連付けがあります。
ユーザーは、ロールの管理者 (role_id = 1) またはユーザー (role_id = 2) にすることができます。
結合テーブル、roles_users には、冗長なレコードがいくつかあります。例:
1:1、2:4などの重複レコードを削除したい。
2 つの質問:
重複を削除する SQL スクリプトを実行するのに最適な場所はどこですか? 移行ですか? 脚本?
重複を削除するためのSQLクエリは何ですか?
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 が指定されている場合、一意のキーが重複している行の最初の行のみが使用されます。他の競合する行は削除されます。正しくない値は、最も一致する許容値に切り捨てられます。