我正在创建一个包含用户提供的 URL 的表。我希望这些是唯一的,所以当用户给我一个 URL 时,我将首先检查 URL 是否存在,如果存在,则返回条目的 ID。如果不是,则使用此 URL 创建一个新行。
显然我希望这很快。最好的选择是什么?
创建具有复合PRIMARY KEY或UNIQUE INDEX用于两列的表可保证 col1、col2 的唯一性。是否有一种棘手的方法可以使两列的相反顺序也成为 UNIQUE (col2, col1)?
例如
PRIMARY KEY (col1, col2)
Run Code Online (Sandbox Code Playgroud)
或者
UNIQUE INDEX (col1, col2)
Run Code Online (Sandbox Code Playgroud)
如果我们有col1=33 && col2=54; 我们如何才能避免INSERT的col1=54 && col2=33?
从外键表中引用唯一索引有什么问题吗?
使用 SQL Server 2008 R2
假设我有一个包含一id列的表,并且我在插入和更新记录时手动维护唯一值,而不是在该列上创建唯一键(例如,通过对 id 列值使用日期和时间,例如 201505061648)。我没有在我的表中使用任何索引或键。那么,即使列的基数为 100%,当我select使用where子句执行查询时,它是否会影响查询性能id?
select * from myTable where id=15
Run Code Online (Sandbox Code Playgroud)
我的意思是唯一约束有助于提高查询性能还是只是强制用户唯一地维护记录,以便 SQL 在唯一约束列上获得更高的选择性?
我对唯一约束和唯一索引了解不多。在这个问题上给出的答案有助于理解 UniqueIndex 和 UniqueKey 之间的区别。我想更多地了解唯一键以及它如何提高我的查询性能。
我有一个INSERT在 Oracle 上运行的冗长语句失败:
ORA-00001: unique constraint (MYPROJECT.MYTABLE_PK) violated
Run Code Online (Sandbox Code Playgroud)
约束是:
CONSTRAINT "MYTABLE_PK" PRIMARY KEY ("ENCOUNTER_NUM", "CONCEPT_CD", "PROVIDER_ID", "START_DATE", "MODIFIER_CD")
Run Code Online (Sandbox Code Playgroud)
INSERT会记录有问题的语句,但不会记录导致违反约束的值。
有没有办法记录或以其他方式保存和查看违反约束的值?
这是 Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64 位生产
使用 PostgreSQL 9.5。似乎 Postgres 与它比较类似于??. 一个唯一的约束是考虑一些相等的字符串,GROUP BY而这些字符串是不同的。
我有一个GROUP BY在TEXT列上使用的选择查询和在其他一些列上使用的聚合函数以确保TEXT输出中列的唯一性,并且我将结果插入到具有主键(因此是唯一的)约束的表中这TEXT列。
看起来与此相似;为简单起见,我刚刚更改了表名:
INSERT INTO mytable ( % mytable has string TEXT PRIMARY KEY, score INT
SELECT
sq1.string string, sq2.score / sq1.score
FROM
(
SELECT n.string string, SUM(n.score) score
FROM
othertable1 n % has string TEXT (non-unique) and score INT
GROUP BY string
) sq1,
(
SELECT n.string string, SUM(n.score) score
FROM
othertable2 n % has string TEXT (non-unique) and score …Run Code Online (Sandbox Code Playgroud) 在创建数据库结构时,我倾向于为每组需要唯一的数据创建唯一的复合键。在它们旁边我通常使用主键(通常是 INT AI id),除非复合键确实足以识别记录。
一方面,好处是我可以避免插入“坏记录”。是否存在这些密钥的使用变得过多或数据库设计不佳的迹象?
如果我INSERT只在主键尚不存在时才想要一行,INSERT直接执行并在重复的情况下忽略错误是否更有效/更简单,还是应该始终先运行SELECT以检查它是否已经存在?
我正在处理一个使用instagram 密钥格式的项目。
TL;DR 64 位整数 ID。
它们将用于查找,我们也喜欢它们用于排序和批处理,因为它们会自然地按创建时间排序。
这些值介于 2^63 和 2^64 之间,因此(只是)太大而无法放入BIGINT.
因此,我们的存储选项似乎是numeric(20)或varchar。varchar不是那么理想,因为我们必须将它们归零才能进行排序才能工作,但是使用数字进行查找会影响性能吗?
我知道 RDBMS 理论中候选键的概念,但是候选键真的存在于实际的 SQL 引擎中吗?我的意思是有什么方法可以在任何 SQL 数据库管理系统(例如 SQL Server、Postgres、MySQL、Oracle 等)中将特定列或列集指定为候选键?
是否有任何保留关键字用于将列指定为候选键,例如PRIMARY KEY或UNIQUE在主键列和唯一列的情况下?
我觉得UNIQUE约束本身提供了候选键概念的实现。我认为拥有单独的CANDIDATE KEY关键字没有任何实际价值。是这样吗?
rdbms primary-key relational-theory unique-constraint candidate-key
mysql ×3
index ×2
postgresql ×2
primary-key ×2
datatypes ×1
duplication ×1
foreign-key ×1
insert ×1
oracle ×1
rdbms ×1
sql-server ×1
unicode ×1