相关疑难解决方法(0)

自定义唯一约束,仅当一列具有特定值时强制执行

是否可以具有如下自定义唯一约束?假设我有两个 colssubsettype,两个字符串(尽管数据类型可能无关紧要)。

如果type是“真”,那么我希望的组合type,并subset是唯一的。否则,没有约束。我在 Debian 上使用 PostgreSQL 8.4。

postgresql index database-design constraint unique-constraint

25
推荐指数
2
解决办法
8732
查看次数

带有 NULL 值的 PostgreSQL UPSERT 问题

我在 Postgres 9.5 中使用新的 UPSERT 功能时遇到问题

我有一个表,用于从另一个表聚合数据。复合键由 20 列组成,其中 10 列可以为空。下面我创建了我遇到的问题的较小版本,特别是 NULL 值。

CREATE TABLE public.test_upsert (
upsert_id serial,
name character varying(32) NOT NULL,
status integer NOT NULL,
test_field text,
identifier character varying(255),
count integer,
CONSTRAINT upsert_id_pkey PRIMARY KEY (upsert_id),
CONSTRAINT test_upsert_name_status_test_field_key UNIQUE (name, status, test_field)
);
Run Code Online (Sandbox Code Playgroud)

根据需要运行此查询(首先插入,然后插入只会增加计数):

INSERT INTO test_upsert as tu(name,status,test_field,identifier, count) 
VALUES ('shaun',1,'test value','ident', 1)
ON CONFLICT (name,status,test_field) DO UPDATE set count = tu.count + 1 
where tu.name = 'shaun' AND tu.status = 1 AND tu.test_field = …
Run Code Online (Sandbox Code Playgroud)

postgresql null upsert unique-constraint postgresql-9.5

20
推荐指数
2
解决办法
2万
查看次数

将所有列标记为主键是否合理?

我有一张代表电影的表。这些字段是:
id (PK), title, genre, runtime, released_in, tags, origin, downloads

我的数据库不会被重复的行污染,所以我想强制执行唯一性。问题是不同的电影可能有相同的标题,甚至除了tags和之外的相同字段downloads。如何实现唯一性?

我想到了两种方法:

  • 制作除downloads主键以外的所有字段。downloads因为它是 JSON,所以我一直在外面,它可能会影响性能。
  • id作为主键保留,但为所有其他列添加唯一约束(再次除外downloads)。

我读了这个非常相似的问题,但我不太明白我该怎么做。目前该表与任何其他表都没有关系,但将来可能会。

目前我的记录略少于 20,000 条,但我预计这个数字会增长。我不知道这是否与问题有些相关。

编辑:我修改了架构,这里是我将如何创建表:

CREATE TABLE movies (
    id          serial PRIMARY KEY,
    title       text NOT NULL,
    runtime     smallint NOT NULL CHECK (runtime >= 0),
    released_in smallint NOT NULL CHECK (released_in > 0),
    genres      text[] NOT NULL default ARRAY[]::text[],
    tags        text[] NOT NULL default ARRAY[]::text[],
    origin      text[] NOT NULL …
Run Code Online (Sandbox Code Playgroud)

postgresql database-design primary-key unique-constraint

9
推荐指数
2
解决办法
575
查看次数

仅当第三列为 NOT NULL 时才使用两列外键约束

鉴于以下表格:

CREATE TABLE verified_name (
  id               SERIAL PRIMARY KEY,
  name             TEXT NOT NULL,
  email            TEXT NOT NULL,
  UNIQUE (name, email)
);

CREATE TABLE address (
  id               SERIAL PRIMARY KEY,
  name             TEXT NOT NULL,
  email            TEXT NOT NULL,
  verified_name_id INTEGER NULL REFERENCES verified_name(id)
);
Run Code Online (Sandbox Code Playgroud)

如何添加附加约束,当address.verified_name_id不为 NULL 时,nameemail字段address必须与引用的字段匹配verified_name

我尝试将以下内容添加到address

FOREIGN KEY (name, email) REFERENCES verified_name(name, email)
Run Code Online (Sandbox Code Playgroud)

...但即使verified_name_id是 NULL ,该约束也会被应用。

我正在寻找类似于部分索引语法的东西,带有像这样的子句WHERE verified_name_id IS NOT NULL,但是简单地将这样的子句附加到 …

postgresql normalization foreign-key database-design constraint

6
推荐指数
1
解决办法
6822
查看次数

每个项目最多强制执行一个 null 的唯一约束

我正在使用 PostgreSQL 9.3。假设我们正在制造某种类型的某些物品,在任何时候我们最多只能生产某种类型的一件物品。下表记录了我们制造物品的历史记录,其中可能有一行manufactured_untilnull- 这些是当前生产的物品。

create table item
(
  id int,
  type_id int,
  manufactured_from timestamp,
  manufactured_until timestamp
)
Run Code Online (Sandbox Code Playgroud)

样本数据:

1  | 101  | 1.1.2000    | 31.12.2012
2  | 102  | 1.4.2003    | 1.1.2010
3  | 101  | 1.1.2013    | 
4  | 102  | 2.1.2010    | 4.5.2014
5  | 102  | 5.5.2014    | 
Run Code Online (Sandbox Code Playgroud)

以下逻辑应该成立:对于每种物品类型,此时最多应该生产一个物品 ( manufactured IS NULL)。在示例中,我应该无法添加记录(6, 101, 27.8.2014, NULL)

我想写一个UNIQUE约束来保护它。是否可以?对于奖励积分,是否有一种相当复杂的方法来保护一种项目类型的间隔不重叠?

postgresql database-design exclusion-constraint unique-constraint

5
推荐指数
1
解决办法
2158
查看次数

为 MySQL 创建部分唯一约束

我和之前的帖子有同样的问题:PostgreSQL 多列唯一约束和 NULL 值。但是那里的解决方案不适用,因为我使用的是 MySQL 而不是 PostgreSQL。

我的桌子看起来像这样:

CREATE TABLE `my_table` (
  `id` bigint(20) NOT NULL,
  `col1` bigint(20) NOT NULL,
  `col2` bigint(20) NOT NULL,
  `col3` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
)
Run Code Online (Sandbox Code Playgroud)

我想要三列col1col2并且col3是独一无二的。但是一个正常的唯一约束

UNIQUE KEY `unique_constraint` (`col1`,`col2`,`col3`)
Run Code Online (Sandbox Code Playgroud)

仍然允许我插入相同的行,其col3NULL. 我想禁止这样的条目:

1  | 1 | 1 | NULL
2  | 1 | 1 | NULL
Run Code Online (Sandbox Code Playgroud)

我在上面的帖子中提出了在 MySQL 中搜索部分唯一约束,但显然 MySQL 5.5 不支持。

有人可以给我一个提示,如何在 mysql 中最好地解决这个问题,我也希望有一个高性能的解决方案!

感谢 mysql 的新手(来自 PostgreSQL)!

mysql null constraint mysql-5.5

4
推荐指数
1
解决办法
3157
查看次数

跨表中所有数据的复杂约束

我们有一个表来记录系统上发生的处理,我们需要确保只有一行处于“处理中”状态。

我想确保结果始终为零或一:

select count(id) from jobs where status in ('P', 'G');
Run Code Online (Sandbox Code Playgroud)

我们正在使用显式事务,因此理想情况下,此检查将在提交时进行,如果不变量不成立则中止事务。对于我们来说,处理任何偶尔会引发错误的异常处理比突然以多个“正在进行”的工作结束要容易得多。

该解决方案只需要与 Postgres 一起使用,因此我们很乐意为此采用非标准解决方案。我们目前使用 8.4,但如果有任何不同,我们将在某个时候升级到 9.x。

postgresql constraint transaction data-integrity postgresql-8.4

4
推荐指数
1
解决办法
3173
查看次数

外键 NULL 与外键到空字符串

这是一个药品目录表。有些有药品品牌,有些是通用的(即他们永远不会有品牌信息)

CREATE TABLE medicine (
   id serial PRIMARY KEY,
   name text NOT NULL,
   brand_id integer
   CONSTRAINT brand_fk FOREIGN KEY (brand_id) REFERENCES brand (id)       
);

CREATE TABLE brand (
  id serial PRIMARY KEY,
  name text NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

对于存储仿制药,例如abc& xyz,有两种选择:

  1. 使用 NULL 作为外键 brand_id

    INSERT INTO medicine (name, brand_id) VALUES ('abc', NULL)
    INSERT INTO medicine (name, brand_id) VALUES ('xyz', NULL)

  2. 在品牌名称中仅插入 1 个空字符串,并将其用于所有仿制药的 Brand_id

    INSERT INTO brand (id, name) VALUES (1, '')
    INSERT INTO medicine (name, brand_id) VALUES …

postgresql foreign-key database-design unique-constraint

4
推荐指数
1
解决办法
7826
查看次数

列唯一性可以交换吗?

我在 Postgres 数据库中有一个表,其中col1col2是指同一列的外键。我只想要 的唯一组合(col1, col2),即如果(1,2)输入则(2,1)应该被拒绝。我怎样才能做到这一点?

我的表定义:

CREATE TABLE mytable (
    id serial primary key,
    col1 int NOT NULL,
    col2 int NOT NULL,
    unique (col1, col2)
)
Run Code Online (Sandbox Code Playgroud)

postgresql constraint unique-constraint

4
推荐指数
1
解决办法
335
查看次数

限制两个特定列值同时存在

我有一个 PostgreSQL 示例表,其中最多允许有一行不是“c”类型的行。

我将不胜感激任何帮助创建一个强制执行这一点的约束。

CREATE TABLE example
(
  example_id    serial PRIMARY KEY,
  example_state CHAR(1) NOT NULL
);

ALTER TABLE example ADD CONSTRAINT 
  example_constraint
CHECK (example_state = 'a' OR example_state = 'b' OR example_state = 'c');
Run Code Online (Sandbox Code Playgroud)

postgresql database-design constraint exclusion-constraint postgresql-9.3

3
推荐指数
1
解决办法
3147
查看次数