22265


UserとLanguageというEntityとuser_languagesという関係データベースが存在するとして、Userは複数のLanguageを持っているとし、Languageは複数のUserに持たれているとします。

[code]

    user
        id
        languages
    language
        id
        name <- 同じnameのエントリーが複数追加されてしまう。
    user_language
        user_id
        language_id
    
[/code]

このような場合の`language`のある要素(`name`)の重複をなくすようなオプションはありますでしょうか。つまり別の`user`が持っている`language`を登録した時にすでにその`language`が`languages`テーブルに存在するときに`user_language`にそのすでに存在する`language`の`id`を登録し、`languages`テーブルにはインサートしないようにしたいです。`INSERT
INTO "languages" ("name") VALUES ('JPN');`を入力した時にした時に重複を避けることは可能でしょうか。  
`name`に`unique`を指定するとエラーがでてしまいました。

[code]

    Error 1062: Duplicate entry 'ENG' for key 'name'
    
[/code]

ちなみに`languages`のスキーマは下記のようになっています。

[code]

    +-------+------------------+------+-----+---------+----------------+
    | Field | Type             | Null | Key | Default | Extra          |
    +-------+------------------+------+-----+---------+----------------+
    | id    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
    | name  | varchar(255)     | NO   | MUL | NULL    |                |
    +-------+------------------+------+-----+---------+----------------+
    
[/code]

`name`には`index:idx_name_code`を設定しています。


CC BY-SA 3.0
2016-02-19T04:34:32.583
22259
2016-02-19T09:14:28.067
7232
question
mysql
MySQLで多対多の関係で片方をuniqueにしたい


> `INSERT INTO "languages" ("name") VALUES
> ('JPN');`を入力した時にした時に重複を避けることは可能でしょうか。

`UNIQUE`制約を指定するのであれば、

[code]

    INSERT IGNORE INTO "languages" ("name") VALUES ('JPN');
    
[/code]

でよいのでは。なおこの場合`LAST_INSERT_ID()`等は使用できなくなりますので、`SELECT`で該当の`language.id`を調べる必要があります。


CC BY-SA 3.0
2016-02-19T09:14:28.067
22265
2016-02-19T09:14:28.067
5750
22259
answer