- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我遇到了连接问题:取回太多记录。我在连接集中添加了一个表,并扩展了行数。通常发生这种情况时,我会选择连接中涉及的所有 ID 字段。这样一来,扩展发生的位置就很明显了,我可以更改连接的 ON 来修复它。除了这种情况,我添加的表没有 ID 字段。这是个问题。但也许我错了。
数据库中的每个表都应该有一个 IDENTITY 字段用作主键吗?在每个表中都有一个 ID 字段有什么缺点吗?如果您有理由确定此表永远不会用于 PK/FK 关系怎么办?
When having an identity column is not a good idea?
最佳答案
有两个概念很接近但不应混淆:IDENTITY
和 PRIMARY KEY
每个表(除了极少数情况)都应该有一个 PRIMARY KEY
,即唯一标识行的一个值或一组值。
参见 here讨论原因。
IDENTITY
是 SQL Server
中列的属性这意味着该列将自动填充递增的值。
由于此属性的性质,此列的值本质上是 UNIQUE
.
然而,没有 UNIQUE
约束或 UNIQUE
索引在 IDENTITY
上自动创建专栏,并在发布后 SET IDENTITY_INSERT ON
可以将重复值插入 IDENTITY
列,除非它是明确的UNIQUE
约束。
IDENTITY
列不一定是 PRIMARY KEY
, 但最常用于填充代理项 PRIMARY KEY
在任何特定情况下它可能有用也可能没有用。
因此,您问题的答案:
The question: should every table in a database have an IDENTITY field that's used as the PK?
这是:
IDENTITY
。字段为 PRIMARY KEY
.当 IDENTITY
不是最好的主意时,我想到了三种情况。作为PRIMARY KEY
:
PRIMARY KEY
是复合的(就像在多对多链接表中一样)PRIMARY KEY
是自然的(比如州代码)PRIMARY KEY
跨数据库应该是唯一的(在这种情况下,您使用 GUID
/UUID
/NEWID
)所有这些情况都意味着以下条件:
IDENTITY
当您关心 PRIMARY KEY
的值(value)时并将它们显式插入到您的表中。更新:
多对多链接表应该有一对 id
到它们作为复合键链接的表。
这是一个自然的复合键,您已经必须使用它(并生成 UNIQUE
),因此没有必要为此生成代理键。
我不明白你为什么要引用 many-to-many
从除它们链接的表之外的任何其他表链接表,但我们假设您有这样的需求。
在这种情况下,您只需通过组合键引用链接表即可。
这个查询:
CREATE TABLE a (id, data)
CREATE TABLE b (id, data)
CREATE TABLE ab (a_id, b_id, PRIMARY KEY (a_id, b_id))
CREATE TABLE business_rule (id, a_id, b_id, FOREIGN KEY (a_id, b_id) REFERENCES ab)
SELECT *
FROM business_rule br
JOIN a
ON a.id = br.a_id
比这个更有效率:
CREATE TABLE a (id, data)
CREATE TABLE b (id, data)
CREATE TABLE ab (id, a_id, b_id, PRIMARY KEY (id), UNIQUE KEY (a_id, b_id))
CREATE TABLE business_rule (id, ab_id, FOREIGN KEY (ab_id) REFERENCES ab)
SELECT *
FROM business_rule br
JOIN a_to_b ab
ON br.ab_id = ab.id
JOIN a
ON a.id = ab.a_id
,原因很明显。
关于sql - 一般来说,数据库中的每个表都应该有一个身份字段用作主键吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1207983/
给定一种支持通过列表进行迭代的编程语言,即 for element in list do ... 如果我们有一个将动态数量的列表作为输入的程序,list[1] ... list[n](其中 n
我有一个小难题。众所周知,按类型定义变量并避免使用变体是最明显的性能技巧。问题是我正在尝试编写一个可以处理隐式类型参数(基本上是变体)的例程库。 举个例子: Sub Test(A As String)
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 8 年前。 Improve this ques
我目前正在使用 Java,所以我更想知道就效率而言,直接插入它是否更好。尽管我也很好奇这是否是一种不好的做法。 最佳答案 不需要。 API 会告诉您它是否已经存在(如果您需要知道),并且 Collec
假设我需要完成三项任务。第一个选项是这样的: void doAllStuffInOneFunc() { //code block for task 1 ... ...
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我不确定这是最好的例子,但这里是。假设我想在 Android 应用程序中将对象绘制到 Canvas 上。我需要做一些数学运算并调用一个方法来返回屏幕大小以确定在哪里绘制它,因为我的应用程序应该支持多个
在下面的选项中,有没有正确的方法来处理使用条件变量时的虚假唤醒? 1) 使用 bool 值将 wait(unique_lock_ul) 放入无限的 while 循环中 unique_lock ul(m
我遇到了连接问题:取回太多记录。我在连接集中添加了一个表,并扩展了行数。通常发生这种情况时,我会选择连接中涉及的所有 ID 字段。这样一来,扩展发生的位置就很明显了,我可以更改连接的 ON 来修复它。
我敢肯定,这个问题不仅只有 1 个答案,而且游戏引擎是否真的会更改内存中的 vector ,或使用 gltransformations?因为一直推和弹出矩阵似乎效率低下,但如果你不断修改vertici
我对程序员在 C 和 C++ 中进行不同编码的基本方式有点模糊。特别是一件事是 C++ 中的字符串在 char 数组上的使用,反之亦然。那么,一般来说,我应该使用字符串还是字符数组,为什么? 最佳答案
当我尝试使用接受“通用迭代器”的 ctor 编写 C++ 类模板时,就会出现这个问题。我不知道这里用general这个词是否合适,但我的意思是它可以像STL容器一样接受迭代器。 换句话说,我对迭代器感
修复警告的短期烦恼是否可以从长远来看支付红利?这样做通常可以避免哪些类型的运行时错误? 最佳答案 我的观点是警告是有原因的,忽略它们会带来危险。虽然有些人真的很挑剔,但在大多数情况下,他们这样做是有充
假设第三方 javascript(不是 NodeJS)模块中有这样的函数: Api.IoAsync(parameter, function(err, message) { ... }) 我想将其转换为
给定任何容器类型,我们可以形成(以元素为中心的) zipper ,并且知道这个结构是一个 Comonad。最近在 another Stack Overflow question 中详细探讨了以下类型:
假设我正在构建一个 Python 程序,一开始我导入了两个模块 - 默认情况下包含在 python 库中的 something 和 somethingElse强>,但事实并非如此。 我有两个几乎相同的
我见过的大多数东西都只是使用最大概率,这看起来不错,但并没有给你任何信心的迹象。相对概率也应该很重要,对吧?让我解释一下: 对于二元分类器,假设您的类别是 A 和 B。 P(A) = 0.01、P(B
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
所以让我们考虑我们有一个父类 class Parent { }; 我有两个 child 类(class) class Child1 : public Parent { void AccessFunc
我刚刚在几个人的帮助下学习外部 CSS。我正在尝试比较两张纸并将其合并为一张,但因为是 2 个人写的,所以我需要整理出他们为 ID 和类提供的名称。一张纸变得非常广泛,但另一张纸有一些我想保留的更新信
我是一名优秀的程序员,十分优秀!