2016-04-06 10 views
1

次の文には適用されません:PostgreSQLのUNIQUE制約は、ドッカーコンテナ

CREATE TABLE IF NOT EXISTS users (
    id SERIAL PRIMARY KEY, 
    username VARCHAR(50) UNIQUE NOT NULL, 
    password VARCHAR(100) NOT NULL, 
    first_name VARCHAR(50) NOT NULL, 
    last_name VARCHAR(50) NOT NULL, 
    address VARCHAR(255) NOT NULL, 
    phone_number VARCHAR(20) NOT NULL 
); 

UNIQUE制約を持っているusernameの原因ではありません。

my_db=# \d users 
            Table "public.users" 
    Column |   Type   |      Modifiers 
--------------+------------------------+---------------------------------------------------- 
id   | integer    | not null default nextval('users_id_seq'::regclass) 
username  | character varying(50) | not null 
password  | character varying(100) | not null 
first_name | character varying(50) | not null 
last_name | character varying(50) | not null 
address  | character varying(255) | not null 
phone_number | character varying(20) | not null 
Indexes: 
    "users_pkey" PRIMARY KEY, btree (id) 

私はドキュメントのUNIQUEに何らかの制限を発見していない質問

。私は何が欠けていますか?

コンテキスト

PostgreSQLが公式PostgreSQL Docker container

+1

がここにあります。おそらく、 'CREATE TABLE IF NOT EXISTS'が干渉し、あなたは古いバージョンを持っていたでしょうか? – wildplasser

+0

@wildplasserそれは問題ではありません。しかし、それは私が私のpostgresドッカーのコンテナ_を__rebuildする必要があると思うと思って、追加された制約を見ました。これは私が行った変更(新しい 'UNIQUE'制約)で新しいイメージを作成します。単にコンテナを停止して再実行しても、既存のイメージに変更は適用されませんでした。あなたが投稿したら正式な回答を受け入れるだろう。そしてありがとう。 – sargas

+0

私のために働く。私の仮説は、テーブルが存在するため(固有の制約なしで)コマンドが実行されていないということです。 – dmg

答えて

0

@wildplasser上で実行して、正しい@dmgあり、IF NOT EXISTS一部は、既存のテーブルを上書きしないと、変更は適用されません。だから落とすと、はコンテナ化されていないデータベースインスタンスに解決されます。

現時点では、新しいSQLスクリプト(UNIQUEという制約が追加されています)でコンテナを再構築する必要がありました(新しいイメージを作成する)。それが問題を解決しました。

Dockerコンテナを停止して再実行するだけでは、SQLスクリプトは適用されません。 official PostgreSQL Docker imageでは、イメージ作成時にinit SQLスクリプトが実行されます(別名docker build)。

SQLスクリプトが変更されるたびに、私はdocker build my_db_containerを実行して古いイメージを削除し、新しいイメージを作成する必要がありました。

解決策を見つけるための私の指示をくれたコメントありがとうございました。

+0

「古い画像を取り除く」とは、現在テーブルにあるすべてのデータを失うことですか? – wildplasser

+0

@wildplasserは、データベースコンテナとは別の[ドッカーボリューム](https://docs.docker.com/engine/userguide/containers/dockervolumes/)にデータを格納していない場合は表示されません。 'docker-compose'は1つを設定してデータベースコンテナにリンクするのが簡単です。 – sargas

+0

DBAまたはデータの所有者として、そのような手順を試みる前に、私はそのことについて確かめたいと思います。 – wildplasser

関連する問題