2016-04-06 2 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 
); 

не вызывает username иметь UNIQUE ограничение.

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 Это не проблема. Но это заставило меня подумать, что мне нужно __rebuild моего postgres docker container__, чтобы увидеть добавленные ограничения. Это создаст новое изображение с изменениями, которые я сделал (добавленное ограничение UNIQUE). Простое прекращение и повторное использование контейнера не применило мои изменения к существующему изображению. Я бы принял формальный ответ, если вы разместите его. И благодарю вас. – sargas

+0

Работает для меня. Моя гипотеза заключается в том, что команда не выполняется, потому что таблица существует (без единственного ограничения). – dmg

ответ

0

@wildplasser и @dmg правильны, IF NOT EXISTS часть не будет превалировать существующую таблицу и изменения не будут применены. Таким образом, это может устранить проблему на экземпляре базы данных без контейнеризации.

В настоящее время мне пришлось перестроить мой контейнер (создать новое изображение) с новым сценарием SQL (который добавил ограничение UNIQUE). Это решило проблему.

Простота остановки и повторного запуска контейнера Docker не применяется к SQL-скрипту. На official PostgreSQL Docker image, скрипт init SQL работает при создании изображения (aka docker build).

Так что для каждого изменения в SQL-скрипте мне пришлось запустить docker build my_db_container, чтобы избавиться от старого изображения и иметь новый.

Спасибо всем за комментарии, которые дали мне направление для поиска решения.

+0

', чтобы избавиться от старого изображения' означает: потерять все данные, имеющиеся в настоящее время в таблице? – wildplasser

+0

@wildplasser нет, если вы храните данные в [тонером докера] (https://docs.docker.com/engine/userguide/containers/dockervolumes/), отдельно от контейнера базы данных. 'docker-compose' делает тривиальным задание и привязывает его к контейнеру базы данных. – sargas

+0

Являясь администратором баз данных или владельцем данных, я хотел бы быть уверенным в этом, прежде чем даже попытаться сделать такие шаги. – wildplasser

Смежные вопросы