Questions tagged «unique-constraint»

DDL UNIQUE约束可确保包含在表中所有行中的一列或一组列中的数据是唯一的。因此,所涉及的一个或多个列中包含的数据对于唯一标识相关表中的行很有用。

6
什么时候应该使用唯一约束而不是唯一索引?
当我希望一列具有不同的值时,我可以使用约束 create table t1( id int primary key, code varchar(10) unique NULL ); go 或者我可以使用唯一索引 create table t2( id int primary key, code varchar(10) NULL ); go create unique index I_t2 on t2(code); 具有唯一约束的列似乎是唯一索引的良好候选者。 是否存在使用唯一约束而不使用唯一索引的已知原因?

3
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) ); 我想(id_A, id_B, id_C)在任何情况下都与众不同。因此,以下两个插入必须导致错误: INSERT INTO my_table VALUES (1, 1, 2, NULL); INSERT INTO my_table VALUES (2, 1, 2, …


4
DBMS中的主键和超级键有什么区别
我是DBMS的新手,但仍在学习该理论。 我对这个关键业务感到非常困惑,在谷歌搜索之后,我将其范围缩小到只有我没有得到的两个关键(主键和超级键)。 我对DBMS有几个问题。如果您能为我回答,我将不胜感激。 1)DBMS中的主键和超级键有什么区别? 如果您可以使用一个全面的示例正确解释,请多多关照 2)主键和超级键都可以有多个列组合形成主键和超级键吗? 3)主键是超级键的子集,反之亦然吗?



4
为什么要使密钥明确?
我对数据库这个主题很陌生,因此听起来似乎很无知,但是我很好奇为什么应该在表中将键显式化。这主要是为了告诉用户给定的列值(希望)在每一行中都是唯一的吗?即使没有提及,唯一性仍然应该存在。

2
避免原子事务中的唯一违规
可以在PostgreSQL中创建原子事务吗? 考虑我有这些行的表类别: id|name --|--------- 1 |'tablets' 2 |'phones' 并且列名具有唯一的约束。 如果我尝试: BEGIN; update "category" set name = 'phones' where id = 1; update "category" set name = 'tablets' where id = 2; COMMIT; 我越来越: ERROR: duplicate key value violates unique constraint "category_name_key" DETAIL: Key (name)=(tablets) already exists.

4
索引唯一性开销
我一直在与我的办公室中的各种开发人员就索引的成本以及唯一性是有利还是昂贵(可能两者都有)进行辩论。问题的症结在于我们的竞争资源。 背景 之前,我曾读过一篇讨论,其中指出Unique索引并不需要额外维护,因为Insert操作会隐式地检查索引是否适合B树,并且如果在非唯一索引中找到重复项,则会在其后附加一个唯一化符。键的结尾,否则直接插入。在此事件序列中,Unique索引没有附加成本。 我的同事通过说这Unique是在寻求B树中的新职位之后强制执行的第二项操作来抗衡此声明,因此,与非唯一索引相比,维护成本更高。 最糟糕的是,我看到了带有标识列(本质上是唯一的)的表,该列是表的集群键,但明确地表示为非唯一。最糟糕的是我对唯一性的痴迷,并且所有索引都被创建为唯一,并且当不可能定义与索引的显式唯一关系时,我将表的PK附加到索引的末尾以确保唯一性得到保证。 我经常参与开发团队的代码审查,并且我需要能够提供一些一般性的指导方针,以使他们可以遵循。是的,应该评估每个索引,但是当您有五台服务器,每台服务器都有数千个表,并且一个表上有多达二十个索引时,您需要能够应用一些简单的规则来确保一定水平的质量。 题 Insert与维护非唯一索引的成本相比,唯一性是否会在后端增加成本?其次,将表的主键附加到索引的末尾以确保唯一性有什么问题? 表定义示例 create table #test_index ( id int not null identity(1, 1), dt datetime not null default(current_timestamp), val varchar(100) not null, is_deleted bit not null default(0), primary key nonclustered(id desc), unique clustered(dt desc, id desc) ); create index [nonunique_nonclustered_example] on #test_index (is_deleted) include …


2
Postgres中的可延迟唯一索引
查看关于alter table的postgres文档,似乎可以将常规约束标记为DEFERRABLE(更具体地讲INITIALLY DEFERRED,这是我感兴趣的)。 索引也可以与约束关联,只要: 索引不能有表达式列,也不能是部分索引 这使我相信,目前尚无办法根据条件创建唯一索引,例如: CREATE UNIQUE INDEX unique_booking ON public.booking USING btree (check_in, check_out) WHERE booking_status = 1; 是INITIALLY DEFERRED,这意味着,该独特性“约束”将只在事务结束进行验证(如果SET CONSTRAINTS ALL DEFERRED;使用)。 我的假设是否正确?如果正确,是否有任何方法可以实现预期的行为? 谢谢

1
更改nvarchar列的大小时,是否需要删除唯一索引?并且在重新创建索引时表会被锁定吗?
在我们的数据库中,存在一个或多或少如下所示的大表: CREATE TABLE dbo.production_data ( pd_id BIGINT PRIMARY KEY, serial NVARCHAR(16) NOT NULL UNIQUE, ... ); 但是现在串行字段的大小已经变小,因此我想将其更改为32。VisualStudio架构比较工具建议通过以下方式进行操作: DROP INDEX ux_production_data_serial ON dbo.production_data; GO ALTER TABLE dbo.production_data ALTER COLUMN serial NVARCHAR(32) NOT NULL; GO CREATE INDEX ux_production_data_serial ON dbo.production_data(serial ASC); 这真的需要吗?还是更像是一种超级节省的方式? 另外,当重新创建唯一索引时,我的表会被锁定吗?因为这将是一个大问题(因为该表具有3000万行,我想重新创建索引将花费相当长的时间),因为下一个维护窗口将在未来几个月内进行。我有什么选择?

2
PostgreSQL UPSERT问题与NULL值
我在使用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) ); 根据需要运行此查询(首先插入,然后随后的插入仅增加计数): INSERT INTO test_upsert as tu(name,status,test_field,identifier, count) VALUES ('shaun',1,'test value','ident', 1) ON CONFLICT …

1
N'Șc'使用Latin1_General_CI_AS排序规则将N'C'的重复密钥视为
我有一个带有唯一键的表,该键包括一NVARCHAR(50)列(是否正确,但在那里)。因此,当尝试插入Șc或C(与插入顺序无关)时,由于排序规则问题,它在第二个插入处中断。这是错误: (受影响的1行)消息2601,级别14,状态1,行16无法在具有唯一索引'IX_TestT'的对象'dbo.testT'中插入重复的键行。重复的键值为(C)。 选择返回: 数据库默认排序规则为Latin1_General_CI_AS。花了一些时间研究如何解决该问题,而又没有太大改变现有的结构,但是找不到找到工作的方法。尝试了不同的排序规则和组合,一切都失败了。阅读(此处和此处)有关字符扩展等方面的信息,但仍然受阻。这是我用来复制问题的示例代码,可以随时进行修改并提出可以帮助解决此问题的任何建议。 CREATE TABLE testT ( [Default_Collation] [NVARCHAR] (50) COLLATE DATABASE_DEFAULT, [Latin1_General_CI_AS] [NVARCHAR] (50) COLLATE Latin1_General_CI_AS, [Latin1_General_CI_AI] [NVARCHAR] (50) COLLATE Latin1_General_CI_AI, [SQL_Collation] [NVARCHAR] (50) COLLATE SQL_Latin1_General_CP1_CI_AS); CREATE UNIQUE CLUSTERED INDEX [IX_TestT] ON [dbo].[testT] ([Default_Collation]) ON [PRIMARY] GO INSERT INTO testT SELECT N'Șc', --COLLATE Latin1_General_CI_AS N'Șc', --COLLATE Latin1_General_CI_AS N'Șc', …

5
为什么此UPDATE会因唯一的键约束冲突而失败?
我是一个“偶然的” DBA,相对缺乏经验并且对此问题感到困惑。 运行MS SQL Server2012。问题在于此UPDATE语句: UPDATE dbo.tAccts SET Ticket = 'ARP.ExGE' , Method = 'smtp' , AcctOwner = 'r00417819' , DisplayName = '~AppLight HBSFax-Inactive' , Destination = 'r00417819@mail.ad.ge.com' , UpdatedBy = SYSTEM_USER , UpdatedOn = CAST(GetDate() AS DATE) FROM dbo.vReclaimable WHERE OHR_EmpStatus <> 'A' 哪个应该只更新vReclaimable视图返回的tAccts表中的行。 vReclaimable视图基于tAccts表,并返回tAccts中的行的子集。 当我运行它时,它会失败并出现一个唯一的关键错误: (0 row(s) affected) …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.