

<https://github.com/blobmon/simplechan>  
上のサイトを一通り終えて、サイトに表示されるboard1 の名前を"Anime & Manga"変更しようと思ってデータベースに入った後に

[code]

    simplech_db-# update boards set board='Anime & Manga', display_name='Anime & Manga' where board='board1' and display_name='Board 1';
    
[/code]

と入力したのですが

[code]

    ERROR: duplicate key value violates unique constraint "boards_pkey"
    
[/code]

[code]

    DETAIL: Key (board)=(Anime & Manga) already exists.
    
[/code]

と表示されてできません。  
また、一度消してやろうと思って

[code]

    truncate table boards;
    
[/code]

と入力したら

[code]

    ERROR: cannot truncate a table referenced in a foreign key constraint
    DETAIL: Table "posts" references "boards".
    HINT: Truncate table "posts" at the same time, or use TRUNCATE ... CASCADE.
    
[/code]

と表示されました。どうやったら、できますか？


CC BY-SA 4.0
2018-06-20T10:33:31.810
44917
2018-06-21T00:17:04.677
2018-06-20T11:01:38.510
question
linux ubuntu postgresql
ERROR: duplicate key value violates unique constraint "boards_pkey"　エラーが出て捜査ができません。


まず、メッセージを理解しましょう。  
「ERROR: duplicate key value violates unique constraint "boards_pkey"」  
重複したキーの値は、boardsテーブルの主キーはユニークでなければならないという制約に反しています。  
「DETAIL: Key (board)=(Anime & Manga) already exists.」  
キー boardの値が、”Anime & Manga”であるレコードは既に存在しています。

「どうやったら、できますか？」  
既にある、boardの値が、”Anime & Manga”であるレコードを削除してください。  
そうすれば、boardの値を”Anime & Manga”に変更してもキーの重複が起こりません。


CC BY-SA 4.0
2018-06-20T11:25:13.740
44919
2018-06-20T11:25:13.740
217
44917
answer


> どうやったら、できますか？

以下のメッセージの意味ですが、

[code]

    ERROR: duplicate key value violates unique constraint "boards_pkey"
    DETAIL: Key (board)=(Anime & Manga) already exists.
    
[/code]

boards テーブルは、board列がプライマリキーとなっており、同じ値を設定することが禁止されています。  
boards テーブルの既存行のboard列に"Anime & Manga"が設定されているため、エラーとなっているという意味だと思います。

また、以下のメッセージの意味ですが、

[code]

    ERROR: cannot truncate a table referenced in a foreign key constraint
    DETAIL: Table "posts" references "boards".
    HINT: Truncate table "posts" at the same time, or use TRUNCATE ... CASCADE.
    
[/code]

boardsテーブルを参照している postsテーブルのデータを truncate できません。  
boardsと同時にpostsテーブルもtruncateする場合は、 TRUNCATE TABLE boards CASCADE
と使いましょうという意味だと思います。

私も知りませんでしたが、[PostgreSQLのドキュメント](https://www.postgresql.jp/document/10/html/sql-
truncate.html)によると、  
「TRUNCATEは、テーブルにON DELETEトリガがあっても、それを発行しません。」そうです。

そのため、  
(ア)boardsテーブルに関連するテーブルの全データを削除しても良い場合は、以下を使用し、

[code]

    TRUNCATE TABLE boards CASCADE;
    
[/code]

(イ)既存行の"Anime & Manga"のみ削除する場合は、以下を使用したら良いと思います。  
(関連テーブルには、ON DELETE CASCADE が設定されているため、関連データもあわせて削除されるはずです。)

[code]

    DELETE FROM boards WHERE board = 'Anime & Manga'
    
[/code]

(ア)(イ)のいずれかを実行後は、以下を実行できると思います。

[code]

    update boards set board='Anime & Manga', display_name='Anime & Manga' where board='board1' and display_name='Board 1';
    
[/code]

捜査がんばってください。


CC BY-SA 4.0
2018-06-20T16:48:47.240
44930
2018-06-21T00:17:04.677
2018-06-21T00:17:04.677
44917
answer