标签: unique-constraint

什么时候应该使用唯一约束而不是唯一索引?

当我希望一列具有不同的值时,我可以使用约束

create table t1(
id int primary key,
code varchar(10) unique NULL
);
go
Run Code Online (Sandbox Code Playgroud)

或者我可以使用唯一索引

create table t2(
id int primary key,
code varchar(10) NULL
);
go

create unique index I_t2 on t2(code);
Run Code Online (Sandbox Code Playgroud)

具有唯一约束的列似乎是唯一索引的良好候选者。

是否有任何已知的原因使用唯一约束而不是使用唯一索引?

index sql-server constraint best-practices unique-constraint

238
推荐指数
4
解决办法
11万
查看次数

PostgreSQL 多列唯一约束和 NULL 值

我有一张如下表:

create table my_table (
    id   int8 not null,
    id_A int8 not null,
    id_B int8 not null,
    id_C int8 null,
    constraint pk_my_table primary key (id),
    constraint u_constrainte unique (id_A, id_B, id_C)
);
Run Code Online (Sandbox Code Playgroud)

我想(id_A, id_B, id_C)在任何情况下都与众不同。所以下面的两个插入肯定会导致错误:

INSERT INTO my_table VALUES (1, 1, 2, NULL);
INSERT INTO my_table VALUES (2, 1, 2, NULL);
Run Code Online (Sandbox Code Playgroud)

但它没有按预期运行,因为根据文档,两个NULL值不会相互比较,因此两个插入都没有错误地通过。

我怎么能保证我的唯一约束,即使id_C可以NULL在这种情况下?实际上,真正的问题是:我可以在“纯 sql”中保证这种唯一性,还是必须在更高级别(在我的情况下为 java)来实现它?

postgresql null constraint unique-constraint

137
推荐指数
3
解决办法
13万
查看次数

为什么 UNIQUE 约束只允许一个 NULL?

从技术上讲,NULL = NULL 是 False,根据该逻辑,没有 NULL 等于任何 NULL,并且所有 NULL 都是不同的。这不应该意味着所有 NULL 都是唯一的并且唯一索引应该允许任意数量的 NULL 吗?

null database-design sql-server constraint unique-constraint

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

忽略重复插入的最佳方法?

背景

此问题与使用 PostgreSQL 9.2 或更高版本忽略重复插入有关。我问的原因是因为这段代码:

  -- Ignores duplicates.
  INSERT INTO
    db_table (tbl_column_1, tbl_column_2)
  VALUES (
    SELECT
      unnseted_column,
      param_association
    FROM
      unnest( param_array_ids ) AS unnested_column
  );
Run Code Online (Sandbox Code Playgroud)

代码不受检查现有值的影响。(在这种特殊情况下,用户并不关心插入重复项的错误——插入应该“正常工作”。)在这种情况下添加代码来显式测试重复项会带来复杂性。

问题

在 PostgreSQL 中,我找到了几种忽略重复插入的方法。

忽略重复 #1

创建一个捕获唯一约束违规的事务,不采取任何行动:

  BEGIN
    INSERT INTO db_table (tbl_column) VALUES (v_tbl_column);
  EXCEPTION WHEN unique_violation THEN
    -- Ignore duplicate inserts.
  END;
Run Code Online (Sandbox Code Playgroud)

忽略重复 #2

创建规则以忽略给定表上的重复项:

CREATE OR REPLACE RULE db_table_ignore_duplicate_inserts AS
    ON INSERT TO db_table
   WHERE (EXISTS ( SELECT 1
           FROM db_table
          WHERE db_table.tbl_column = NEW.tbl_column)) DO INSTEAD NOTHING;
Run Code Online (Sandbox Code Playgroud)

问题

我的问题主要是学术性的:

  • 什么方法最有效?
  • 什么方法最容易维护,为什么? …

postgresql constraint insert duplication unique-constraint

35
推荐指数
1
解决办法
9万
查看次数

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

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

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

postgresql index database-design constraint unique-constraint

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

DBMS中的主键和超级键有什么区别

我是 DBMS 的新手,我仍在学习理论。

我对这个关键业务感到非常困惑,在谷歌搜索之后,我将它缩小到只有 2 个我没有得到的键(主键和超级键)。

我有几个关于 DBMS 的问题。如果您能为我解答这些问题,我将不胜感激。

1) DBMS 中的主键和超级键有什么区别? 如果你能用一个全面的例子来正确解释,非常感谢

2)主键和超级键都可以可以有多个列组合成主键和超级键吗?

3)主键是超级键的子集,反之亦然?

primary-key unique-constraint candidate-key

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

带有 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万
查看次数

“唯一键”和“主键”的区别

MySQLUnique KeyPrimary KeyMySQL之间的主要区别是什么?

mysql primary-key unique-constraint

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

避免原子交易中的唯一违规

可以在 PostgreSQL 中创建原子事务吗?

考虑我有这些行的表类别:

id|name
--|---------
1 |'tablets'
2 |'phones'
Run Code Online (Sandbox Code Playgroud)

并且列名具有唯一约束。

如果我尝试:

BEGIN;
update "category" set name = 'phones' where id = 1;
update "category" set name = 'tablets' where id = 2;
COMMIT;
Run Code Online (Sandbox Code Playgroud)

我越来越:

ERROR:  duplicate key value violates unique constraint "category_name_key"
DETAIL:  Key (name)=(tablets) already exists.
Run Code Online (Sandbox Code Playgroud)

postgresql transaction unique-constraint

17
推荐指数
2
解决办法
8218
查看次数

NVARCHAR 列作为 PRIMARY KEY 或 UNIQUE 列

我正在开发一个 SQL Server 2012 数据库,我对 nvarchar 列作为主键有疑问。

我有这张桌子:

CREATE TABLE [dbo].[CODES]
(
    [ID_CODE] [bigint] IDENTITY(1,1) NOT NULL,
    [CODE_LEVEL] [tinyint] NOT NULL,
    [CODE] [nvarchar](20) NOT NULL,
    [FLAG] [tinyint] NOT NULL,
    [IS_TRANSMITTED] [bit] NOT NULL DEFAULT 0,
     CONSTRAINT [PK_CODES] PRIMARY KEY CLUSTERED 
    (
        [CODE_LEVEL] ASC,
        [CODE] ASC
    )
)
Run Code Online (Sandbox Code Playgroud)

但现在我想使用[CODE]列作为主键并删除[ID_CODE]列。

如果我有一个NVARCHAR专栏,有什么问题或惩罚PRIMARY KEY吗?

[CODE]列值必须是唯一的,所以我认为我可以UNIQUE为该列设置约束。

我是否必须用[CODE]作主键,还是UNIQUE[CODE]列上设置约束更好?

sql-server primary-key unique-constraint

16
推荐指数
3
解决办法
3万
查看次数