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目标值的通用方法是什么?
普通更新只会给我带来约束违规,即使它发生在单个语句中。
删除并重新创建唯一约束的成本很高,而且并发性很差。
这似乎是一个很常见的问题,应该有一个好的方法来做到这一点,但我只是想不出。
我有一个这样的表:
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
我有一台运行 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 的处理方式有什么不同吗
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以避免重复记录。我对吗?
考虑一个表
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任务?
我正在将不同来源的平面文件导入 SQL Server 中的表中。我正在使用提取中的字段组合创建一个复合主键,这些字段将为我的每一行提供一个唯一的键。
我现在的做法是从 1 个字段开始,然后继续连接字段,直到找到对所有记录都是唯一的键。这可能有点耗时,或者我最终可能会连接比我真正需要的更多的列以获得唯一键。
是否有某种 SQL 脚本可以在表上运行,它会给我最少数量的字段(名称),我需要连接以获得唯一键?因此,如果表中有 1 个字段对所有记录都是唯一的,则将返回该 1 个字段名称。如果我需要连接 [memberid]、[claimid] 和 [date of service] 以获得唯一键,那么这 3 个字段名称将是脚本的结果。
我有一个表,在 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
有没有办法在 SQL Server 数据库中的表之间创建唯一索引?我有两个表,表 A 和表 B。因为我有一个名为 ID 的列,我想让这些 Id 列唯一(组合表 A 和 B 的 Ids )
我怎样才能做到这一点 ?
我有一个事件表,聚集索引是创建日期/时间。
通常情况下,在同一毫秒内永远不会发生两个事件,但会发生异常事件,因此该列不一定是唯一的。
我想添加一个 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
具有以下表结构
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 …
sql-server ×5
index ×4
mysql ×3
duplication ×2
innodb ×2
postgresql ×2
constraint ×1
myisam ×1
primary-key ×1
query ×1
update ×1