是否可以具有如下自定义唯一约束?假设我有两个 colssubset和type,两个字符串(尽管数据类型可能无关紧要)。
如果type是“真”,那么我希望的组合type,并subset是唯一的。否则,没有约束。我在 Debian 上使用 PostgreSQL 8.4。
postgresql index database-design constraint unique-constraint
我在 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) 我有一张代表电影的表。这些字段是:
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) 鉴于以下表格:
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 时,name和email字段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
我正在使用 PostgreSQL 9.3。假设我们正在制造某种类型的某些物品,在任何时候我们最多只能生产某种类型的一件物品。下表记录了我们制造物品的历史记录,其中可能有一行manufactured_until是null- 这些是当前生产的物品。
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
我和之前的帖子有同样的问题: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)
我想要三列col1,col2并且col3是独一无二的。但是一个正常的唯一约束
UNIQUE KEY `unique_constraint` (`col1`,`col2`,`col3`)
Run Code Online (Sandbox Code Playgroud)
仍然允许我插入相同的行,其col3为NULL. 我想禁止这样的条目:
1 | 1 | 1 | NULL
2 | 1 | 1 | NULL
Run Code Online (Sandbox Code Playgroud)
我在上面的帖子中提出了在 MySQL 中搜索部分唯一约束,但显然 MySQL 5.5 不支持。
有人可以给我一个提示,如何在 mysql 中最好地解决这个问题,我也希望有一个高性能的解决方案!
感谢 mysql 的新手(来自 PostgreSQL)!
我们有一个表来记录系统上发生的处理,我们需要确保只有一行处于“处理中”状态。
我想确保结果始终为零或一:
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
这是一个药品目录表。有些有药品品牌,有些是通用的(即他们永远不会有品牌信息)
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,有两种选择:
使用 NULL 作为外键 brand_id
INSERT INTO medicine (name, brand_id) VALUES ('abc', NULL)
INSERT INTO medicine (name, brand_id) VALUES ('xyz', NULL)
在品牌名称中仅插入 1 个空字符串,并将其用于所有仿制药的 Brand_id
INSERT INTO brand (id, name) VALUES (1, '')
INSERT INTO medicine (name, brand_id) VALUES …
我在 Postgres 数据库中有一个表,其中col1和col2是指同一列的外键。我只想要 的唯一组合(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 示例表,其中最多允许有一行不是“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
postgresql ×9
constraint ×6
foreign-key ×2
null ×2
index ×1
mysql ×1
mysql-5.5 ×1
primary-key ×1
transaction ×1
upsert ×1