MySQLで重複したレコードを除いてINSERTを行う

マップ系のテーブルとかで重複したレコードを除きつつ、INSERTを行うには、 NOT EXISTS を使います。

INSERT INTO eip_t_acl_user_role_map(user_id,role_id) 
SELECT 
    user_id,(SELECT role_id FROM eip_t_acl_role WHERE role_name = '権限名' limit 1)
FROM
    turbine_user
WHERE
    disabled != 'T'
        AND NOT (login_name = 'admin'
        OR login_name = 'anon'
        OR login_name = 'template')
    AND NOT EXISTS( 
SELECT 
    *
FROM
    eip_t_acl_user_role_map
WHERE
    eip_t_acl_user_role_map.user_id = turbine_user.user_id
        AND role_id = (SELECT 
            role_id
        FROM
            eip_t_acl_role
        WHERE
            role_name = '権限名'
        LIMIT 1));

なお、JavaとかでこのSQLを流し込む場合には executeQuery も executeUpdate も使えないので注意が必要です。executeで流し込んであげてください。

executeUpdateで実行してみると、以下のようにしてUPDATE内でSELECTを使うな、と怒られます。

 Can not issue SELECT via executeUpdate()

executeQueryを使ってみると、以下のようなエラーが出ます。

Can not issue data manipulation statements with executeQuery().