【问题标题】:PostgreSQL UNIQUE constraint not being applied on Docker containerPostgreSQL UNIQUE 约束未应用于 Docker 容器
【发布时间】:2016-04-06 14:47:06
【问题描述】:

以下声明:

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上运行

【问题讨论】:

  • 在这里工作。也许CREATE TABLE IF NOT EXISTS 干扰了你有一个旧版本?
  • @wildplasser 这不是问题。但这让我觉得我需要重建我的 postgres docker 容器才能看到添加的约束。这将使用我所做的更改(添加的UNIQUE 约束)创建一个新图像。仅仅停止并重新运行容器并没有将我的更改应用于现有图像。如果你发布一个,我会接受一个正式的答案。谢谢。
  • 为我工作。我的假设是该命令没有运行,因为表存在(没有唯一约束)。

标签: postgresql docker constraints unique-constraint


【解决方案1】:

@wildplasser 和@dmg 是正确的,IF NOT EXISTS 部分不会覆盖现有表并且不会应用更改。所以放弃这将解决问题在非容器化数据库实例上

在当前问题上,我必须使用新的 SQL 脚本(添加了 UNIQUE 约束)重建我的容器(创建新映像)。这样就解决了问题。

仅停止并重新运行 Docker 容器不会应用 SQL 脚本。在official PostgreSQL Docker image 上,init SQL 脚本在创建映像时运行(又名docker build)。

因此,对于 SQL 脚本中的每一次更改,我都必须运行 docker build my_db_container 以摆脱旧图像并拥有一个新图像。

感谢所有帮助我找到解决方案的 cmets。

【讨论】:

  • to get rid of the old image 表示:丢失表中当前存在的所有数据?
  • @wildplasser 如果您将数据存储在与数据库容器分开的docker volume 中,则不会。 docker-compose 使设置一个并将其链接到数据库容器变得微不足道。
  • 作为 DBA 或数据的所有者,我想在尝试这些步骤之前确定这一点。
  • @wildplasser 当然。发布此问题后,我进行了多次测试。容器消失后数据确实存在。一个问题是卷可能硬链接到图像。因此,如果图像发生变化,音量将不再起作用。但数据仍然存在。您可以将其连接到另一个容器并提取数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-17
  • 1970-01-01
  • 2021-12-09
  • 2017-08-05
  • 2023-03-21
  • 1970-01-01
相关资源
最近更新 更多