标签: unique-constraint

如何同时更新 PostgreSQL 中的唯一键?

CREATE TABLE widget (
  id serial PRIMARY KEY,
  name text NOT NULL,
  ordinal int NOT NULL UNIQUE
);
Run Code Online (Sandbox Code Playgroud)

我有数据

 id | name | ordinal 
----+------+---------
  1 | A    |       1
  2 | B    |       2
  3 | C    |       3
Run Code Online (Sandbox Code Playgroud)

我想将其更新为

 id | name | ordinal 
----+------+---------
  1 | A    |       3
  2 | B    |       2
  3 | C    |       1
Run Code Online (Sandbox Code Playgroud)

尽可能少地接触记录(即不要重写整个记录集,不要启动不必要的触发器),更新为ordinal目标值的通用方法是什么?

普通更新只会给我带来约束违规,即使它发生在单个语句中。

删除并重新创建唯一约束的成本很高,而且并发性很差。

这似乎是一个很常见的问题,应该有一个好的方法来做到这一点,但我只是想不出。

postgresql update unique-constraint

4
推荐指数
2
解决办法
1465
查看次数

当贡献列已经是唯一的时,计算列上的唯一索引

我有一个这样的表:

CREATE TABLE
  dbo.DiscountBarcodeList
(

  ID int NOT NULL IDENTITY
    CONSTRAINT PK_DiscountBarcodeList
    PRIMARY KEY CLUSTERED

, Discount int NOT NULL
    CONSTRAINT FK_DiscountBarcodeList_Discount
    FOREIGN KEY REFERENCES dbo.Discount (ID)

, CodeNumber int NOT NULL

, AssignedEntity int NULL
    CONSTRAINT FK_DiscountBarcodeList_AssignedEntity
    FOREIGN KEY REFERENCES dbo.Entity (ID)
    ON DELETE SET NULL

, BarcodeID AS
    CONVERT(
      char(10)
    , CAST(Discount AS binary(2)) + CAST(CodeNumber AS binary(3))
    , 2)

, CONSTRAINT UQ_DiscountBarcodeList_DiscountCodeNumber
    UNIQUE NONCLUSTERED 
    (
      Discount  ASC
    , CodeNumber ASC
    )

);
Run Code Online (Sandbox Code Playgroud)

该表将保存预先CodeNumber分配给 s 的 …

index sql-server sql-server-2014 unique-constraint computed-column

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

如何优化我的 mysql 设置以更快地创建我的索引?

我有一台运行 Ubuntu 10.04 的服务器,并通过包安装了 Mysql 5.1x。该系统有 128GB 内存,8 个内核,并有 4TB 的可用空间,用于存储 Mysql 和 Mysql tmp。

我有一个这样的 MyISAM:

CREATE TABLE `data_store` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `uniqname` varchar(150) NOT NULL,
  `data` blob,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM CHARSET=latin1;
Run Code Online (Sandbox Code Playgroud)

我插入了 8 亿条记录(插入前大约有 350GB 数据),然后尝试添加以下索引:

ALTER TABLE data_store DISABLE KEYS;
ALTER TABLE data_store ADD INDEX uniqname_index (uniqname);
ALTER TABLE data_store ENABLE KEYS;
Run Code Online (Sandbox Code Playgroud)

(关于DISABLE KEYS命令,我看到在其他地方建议在插入数据之前使用,并且由于该命令从未使用过ENABLE KEYS,我认为它对我没有用处。我主要只是在我对我的描述中进行了详尽的描述我在做。)

当我开始索引作业时,显示的第一个状态SHOW PROCESSLIST是“复制到 tmp 表”。

几个小时后,我检查了 bac,即使在 24 小时后,状态仍保留在“使用密钥缓存修复”消息上。我尝试在稍旧的服务器上运行该作业,3 天后,它仍然保持“使用密钥缓存修复”状态。因此,我在这台较新的机器上取消了 create-index …

mysql myisam index unique-constraint

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

UNIQUE(), INDEX() 与 UNIQUE INDEX() 不同吗?

mysql 的处理方式有什么不同吗

UNIQUE (column1, column2),
INDEX (column1)
Run Code Online (Sandbox Code Playgroud)

UNIQUE INDEX (column1, column2)
Run Code Online (Sandbox Code Playgroud)

UNIQUE (column1, column2)
Run Code Online (Sandbox Code Playgroud)

在后者中,我认为mysql会自动创建索引UNIQUE以避免重复记录。我对吗?

mysql innodb index unique-constraint

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

如何使用 ON DUPLICATE KEY 进行更新

考虑一个表

CREATE TABLE test
(
id int(11) unsigned NOT NULL AUTO_INCREMENT,
external_id int(11),
number smallint(5),
value varchar(255),
UNIQUE INDEX (external_id, number),
PRIMARY KEY(id)
) ENGINE=InnoDB
Run Code Online (Sandbox Code Playgroud)

将 number 的值更新为

UPDATE test SET number=number + 1 WHERE external_id='X'
Run Code Online (Sandbox Code Playgroud)

或者

UPDATE test SET number='Y' WHERE external_id='X'
Run Code Online (Sandbox Code Playgroud)

由于 external_id-number 对是唯一的,如果 number 的新值存在,则不会更新。

如何根据 UNIQUE 约束使用类似INSERT ... ON DUPLICATE KEY增加numberby的值number + 1以达到可用值并完成UPDATE任务?

mysql innodb query duplication unique-constraint

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

以编程方式查找创建唯一组合键所需的最少字段集

我正在将不同来源的平面文件导入 SQL Server 中的表中。我正在使用提取中的字段组合创建一个复合主键,这些字段将为我的每一行提供一个唯一的键。

我现在的做法是从 1 个字段开始,然后继续连接字段,直到找到对所有记录都是唯一的键。这可能有点耗时,或者我最终可能会连接比我真正需要的更多的列以获得唯一键。

是否有某种 SQL 脚本可以在表上运行,它会给我最少数量的字段(名称),我需要连接以获得唯一键?因此,如果表中有 1 个字段对所有记录都是唯一的,则将返回该 1 个字段名称。如果我需要连接 [memberid]、[claimid] 和 [date of service] 以获得唯一键,那么这 3 个字段名称将是脚本的结果。

database-design sql-server primary-key unique-constraint

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

无法使用 IGNORE_DUP_KEY = ON 创建 UNIQUE 过滤索引

我有一个表,在 SQL Server 2012 企业版中,我想要一个唯一的索引IGNORE_DUP_KEY = ON,但是我只希望这个索引(并忽略重复项)仅应用于表的一个子集 - 仅带有FLAG = 1.

CREATE TABLE [dbo].[FOO]
([ID] NOT NULL,
[Value] [int] NULL,
[FLAG] [bit] NULL)
Run Code Online (Sandbox Code Playgroud)

尝试使用以下查询创建索引时

CREATE UNIQUE NONCLUSTERED INDEX [IDX_UQ_FL_FOO_VALUE] ON [dbo].[FOO]
([Value] ASC)
WHERE [flag] = 1
WITH (IGNORE_DUP_KEY = ON)
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

消息 10618,级别 16,状态 1,第 1 行无法在表 'dbo.FOO' 上创建过滤索引 'IDX_UQ_FL_FOO_VALUE',因为该语句将 IGNORE_DUP_KEY 选项设置为 ON。重写该语句,使其不使用 IGNORE_DUP_KEY 选项。

不能将过滤的唯一索引与IGNORE_DUP_KEY = ON?

将索引设置为非唯一不是一个选项。我需要它是唯一的来过滤重复的插入,但仅当插入带有FLAG = 1. 我需要忽略重复行的插入,而不是失败。

sql-server duplication sql-server-2012 filtered-index unique-constraint

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

如何跨多个表创建唯一(索引)约束?

有没有办法在 SQL Server 数据库中的表之间创建唯一索引?我有两个表,表 A 和表 B。因为我有一个名为 ID 的列,我想让这些 Id 列唯一(组合表 A 和 B 的 Ids )

我怎样才能做到这一点 ?

index sql-server unique-constraint

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

为非唯一聚集索引创建一个可见的唯一符列

我有一个事件表,聚集索引是创建日期/时间。

通常情况下,在同一毫秒内永远不会发生两个事件,但会发生异常事件,因此该列不一定是唯一的。

我想添加一个 uniquifier 列,即在给定时间内插入的第一个行为 0,第二个为 1,依此类推:

TIME                    UNIQUIFIER,     TEXT
2018-01-01 01:23:45.678,   0,           "aaa"
2018-01-01 02:00:00.000,   0,           "bbb"
2018-01-01 02:00:00.000,   1,           "ccc"
2018-01-01 02:00:00.000,   2,           "ddd"
2018-01-01 03:45:67.890,   0,           "eee"
Run Code Online (Sandbox Code Playgroud)

我知道当我创建聚集索引时,MS Sql Server 会自动创建这样一个列。但是该列是隐藏的。

我想要一个可见的 uniquifier,它的行为就像这个隐藏的一样,所以我可以在外键关系中使用它。

也就是说,当...

  • 另一个表需要引用现有事件,
  • 而我只知道那件事发生的时间,
  • 而我只关心同时发生的第一个事件,

...我可以Time:2018-01-01 02:00:00 / Uniquifier:0用作外键,知道该行存在,而无需在第一个表中查找事件。

我可以使用自动递增的标识列来使键唯一,但这意味着我无法在不知道标识列的情况下引用事件。

例如,如果我想在单独的 1-n 表中创建事件和一堆额外的事件信息,我必须首先创建事件,然后查找其标识列,然后才创建相关信息,使用它身份栏。我试图避免往返。

是否有可能在 SQL Server 中使用自动值填充这样一个可见的列,与隐藏的 uniquifier 列相同?

还是在插入行时必须手动计算这样的列?

sql-server sql-server-2014 unique-constraint computed-column

3
推荐指数
2
解决办法
353
查看次数

具有 NULL 值的复合唯一约束

具有以下表结构

CREATE TABLE favorite_comments(
   id SERIAL PRIMARY KEY NOT NULL,
   opinion_id BIGINT REFERENCES opinions(id),
   review_id BIGINT REFERENCES reviews(id),
   list_id INTEGER REFERENCES lists(id) NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

这是有效记录(与同一列表相关的评论和意见):

id,  opinion_id,  review_id,  list_id
-------------------------------------
1,          333,       NULL,        4
2,         NULL,        444,        4
Run Code Online (Sandbox Code Playgroud)

但我想防止相同的评论或意见可能出现两次与同一个列表相关:

id,  opinion_id,  review_id,  list_id
-------------------------------------
1,          333,       NULL,        4
2,         NULL,        444,        4
3,         NULL,        444,        4 <- WRONG
Run Code Online (Sandbox Code Playgroud)

我想添加一个检查条件唯一性的约束UNIQUE(opinion_id, list_id) OR UNIQUE(review_id, list_id),但是因为opinion_id,review_id可以是 NULL 我对此有一些麻烦

我试过这个但不起作用

ALTER TABLE favorite_comments ADD CONSTRAINT comments_can_only_be_saved_once_per_list UNIQUE …

postgresql constraint check-constraints unique-constraint

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