Questions tagged «primary-key»

在关系数据库设计中,主键可以唯一地标识表中的每一行。主键包括一个单列或一组列。

4
使用广泛的PK与单独的合成密钥和UQ之间的性能考虑因素是什么?
我有几个表,其中的记录可以通过几个广泛的业务领域进行唯一标识。过去,我将这些字段用作PK,并牢记以下好处: 简单; 没有多余的字段,只有一个索引 群集允许快速合并联接和基于范围的过滤器 但是,我听说过创建合成IDENTITY INTPK,而用单独的UNIQUE约束来强制业务密钥的情况。优点是,较窄的PK使得二级索引要小得多。 如果一个表有没有比PK其他指标,我看不出有任何理由赞成第二种方法,虽然在一个大表它可能是最好的假设,指数可能在未来是必要的,因此,有利于在狭窄合成PK 。我有什么需要考虑的地方吗? 顺便说一句,我并不是在反对在数据仓库中使用合成密钥,我只是对何时使用单个广泛的PK,何时使用狭窄的PK加广泛的英国感兴趣。


3
列出索引和约束
我正在查看我继承的应用程序的SQL Server数据库。我已经有大约10年没有研究SQL Server了,所以请多多包涵。 我正在查看的数据库表有一个bigint NOT NULL名为的列id,但是,当我检查约束时,没有看到任何约束,所有数据库表也是如此。 我是否假设这些表上没有主键并且没有索引(聚集或非聚集),对吗? 我运行了以下查询,结果似乎证实了我的怀疑: //**returns 0** select count(*) from INFORMATION_SCHEMA.TABLE_CONSTRAINTS; //**returns no rows** select * from sys.indexes where object_id = (select object_id from sys.objects where name = 'NAME-OF-TABLE'); //**returns all tables in database** SELECT name FROM sys.tables WHERE OBJECTPROPERTY(object_id,'IsIndexed') = 0;

3
我是否应该仅出于PK目的将自动递增/ IDENTITY字段添加到交叉引用表中?
我将以下交叉引用表添加到我的SQL Server托管的数据库中: company_id bigint not null (FK) org_path nvarchar (2048) not null 该company_id字段引用id另一个表(其中是主键)中的字段。 假设还可以有多个具有相同记录的记录,则company_id任何主键都必须使用两个字段。但是,由于org_pathSQL Server太长,因此无法使用这两个字段创建密钥。 至于org_path,这是它存在的唯一表。对该表的查询极有可能会询问所有条目或的所有org_path条目company_id。或者换种说法,该表是否会被查询似乎令人怀疑org_path。此外,它不太可能org_path会被更新,更不可能被插入并且可能很少被删除。 我希望总行数可以低到几千。 另外,这nvarchar (2048)是因为该值必须模仿第三方数据库中的值。一个典型的例子是 \Translation Providers\[customer name]\[order name]\ 并可能包含变音符号。 所以我的问题是这样的:添加自动递增id字段并将其与company_id主键结合使用会更有效,还是会增加不必要的开销-并且company_id作为另一个表中主键的事实是否具有任何意义?效果在这里?

2
SQL Server相当于Oracle USING INDEX子句
在Oracle中是否有与USING INDEX子句等效的SQL Server 2008?专门针对构造: CREATE TABLE c(c1 INT, c2 INT); CREATE INDEX ci ON c (c1, c2); ALTER TABLE c ADD CONSTRAINT cpk PRIMARY KEY (c1) USING INDEX ci; 在有关唯一索引的Sql Server 文档中,它指出了(强调): 唯一索引通过以下方式实现: 主键或唯一约束 创建PRIMARY KEY约束时,如果表上的聚簇索引尚不存在并且未指定唯一的非聚簇索引,则会在一个或多个列上自动创建一个唯一的聚簇索引。主键列不能使用NULL值。 这似乎暗示着有一种方法可以指定应将哪个索引用于主键。

3
将除一列以外的所有列标记为主键是否合理?
我有一张代表电影的桌子。字段是: id (PK), title, genre, runtime, released_in, tags, origin, downloads。 我的数据库不能被重复的行污染,所以我想强制唯一性。问题在于,除了tags和之外,不同的电影可能具有相同的标题,甚至相同的字段downloads。如何实施唯一性? 我想到了两种方法: 使除downloads主键之外的所有字段。我将其downloads排除在外,因为它是JSON,它可能会影响性能。 仅保留id为主键,但为所有其他列添加唯一约束(再次除外downloads)。 我读过这个非常相似的问题,但是我不太明白该怎么办。当前,该表与任何其他表均不相关,但将来可能与此相关。 目前,我的记录略少于20,000,但是我希望这个数字会增加。我不知道这是否与问题有关。 编辑:我修改了架构,这是我将如何创建表: CREATE TABLE movies ( id serial PRIMARY KEY, title text NOT NULL, runtime smallint NOT NULL CHECK (runtime >= 0), released_in smallint NOT NULL CHECK (released_in > 0), genres text[] NOT NULL default …

2
SQL Server如何为外键引用选择索引键?
我正在使用从MS Access导入的旧数据库。在MS Access> SQL Server升级期间创建了大约二十个带有非集群唯一主键的表。 这些表中的许多表还具有唯一的非聚集索引,这些索引与主键重复。 我正在尝试清理。 但是我发现的是,在将主键重新创建为聚簇索引之后,然后尝试重建外键,该外键引用了旧的重复索引(这是唯一的)。 我知道这是因为它不会让我删除重复的索引。 我认为如果存在,SQL Server总是会选择一个主键。SQL Server是否具有在唯一索引和主键之间进行选择的方法? 要复制该问题(在SQL Server 2008 R2上): IF EXISTS (SELECT * FROM sys.tables WHERE name = 'Child') DROP TABLE Child GO IF EXISTS (SELECT * FROM sys.tables WHERE name = 'Parent') DROP TABLE Parent GO -- Create the parent table CREATE …

3
需要帮助解决Sql Server 2005死锁方案
我遇到了一个死锁情况,死锁中唯一的参与者似乎是一个表和一个从该表中删除的存储过程。我根据以下几个死锁时对sql错误日志的分析得出了该结论,并使用下面的MSDN文章作为指导来解密错误日志中的跟踪。 表DEXTable和存储过程ClearDEXTableRows在下面定义。还有另一个存储过程InsertDEXTableRow将行插入DEXTable中,但是基于sql错误日志中的条目,该proc似乎不涉及死锁。 DEXTable具有〜830万行,并且趋于稳定增长。受访者表也很大,并且趋于稳定增长。 可从高流量网站访问该页面,该页面上的页面经常快速连续调用ClearDEXTableRows和InsertDEXTableRow。 在过去的10天里,僵局每天发生0到9次。 我已经为1222启用了SQL跟踪(使用DBCC TRACEON 1222),并且最近才启用了标志1204。在检测和结束死锁上有这些标志的输出的详细说明 我的问题是: 仅此一个存储过程ClearDEXTableRows是造成死锁的原因吗? 如果是这样,谁能提供一个很好的解释,说明如何发生并提出解决方法? 我的怀疑是DELETE语句导致DEXTable PK上的争用,而DEXTable则需要经常重建。 如果不是,我应该启用什么其他跟踪来更深入地了解死锁的原因?(我想在这里学习) -- Table definition CREATE TABLE [dbo].[DEXTable]( [ExportID] [int] NOT NULL, [RespondentID] [int] NOT NULL, [Exported] [datetime] NOT NULL, CONSTRAINT [PK_DEXTable] PRIMARY KEY CLUSTERED ( [ExportID] ASC, [RespondentID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY …


2
DynamoDB-多个范围键
是否可以将多个字段用作范围键? 假设我有一张表格,其中每一行都由 <A,B,C> ------------------------------- A | B | C | D | E | ------------------------------- A主hash键在哪里 我想B和C作为主range键。 如何在DynamoDB中将两个以上字段用作主键?

1
在PostgreSQL中压缩序列
我id serial PRIMARY KEY在PostgreSQL表中有一列。id由于我已删除相应的行,因此缺少许多。 现在,我想通过重新启动序列并以保留id原始id顺序的方式重新分配s 来“压缩”表。可能吗? 例: 现在: id | data ----+------- 1 | hello 2 | world 4 | foo 5 | bar 后: id | data ----+------- 1 | hello 2 | world 3 | foo 4 | bar 我尝试了StackOverflow答案中提出的建议,但没有成功: # alter sequence t_id_seq restart; ALTER SEQUENCE # …

3
在InnoDB表中,将主键作为复合二级索引的最后一列有什么作用?
假设我有一对一的关系(person_id, pet_id)。我有一个表在哪里pet_id是主键。 我了解InnoDB二级索引实际上是一个B树,其中的值是该行的相应主键值。 现在,假设一个人可以养成千上万只宠物,而我经常想要一个人的宠物按顺序排列pet_id。那么,如果在第二个索引记录的排序会的问题(person_id, pet_id)或只是person_id用pet_id的该person_id是无序。猜后来。 因此,如果person_id是非唯一的,记录是按(person_id, pet_id)还是JUST 物理排序的pet_id? 谢谢

1
带有条件的唯一标识符字段
我有一个不在生产中的数据库,所以主表是CustodyDetails,此表有一个ID int IDENTITY(1,1) PRIMARY KEY列,我正在寻找一种添加另一个在其他任何表中都未引用的唯一标识符的方法。帐户列的内容将不完全是一个身份密钥。 这个新的身份列中有一些具体细节,这就是我的问题所在。格式如下:XX/YY其中XX是一个自动递增的值,它将在每个新年度重置/重新启动,而YY是本年度的后两位SELECT RIGHT(YEAR(GETDATE()), 2)。 因此,例如,让我们假设从2015年12月28 日至03/01/2016结束的一天添加了一条记录,该列将如下所示: ID ID2 DATE_ADDED 1 1/15 2015-12-28 2 2/15 2015-12-29 3 3/15 2015-12-30 4 4/15 2015-12-31 5 1/16 2016-01-01 6 2/16 2016-01-02 7 3/16 2016-01-03 我想到了使用前端来解析组合ID(示例中为ID2)以获取最后2位数字并与当年的最后2位数字进行比较,然后决定是否启动新的相关项。当然,能够在数据库端完成所有操作将是宏伟的。 编辑1:顺便说一句,我也看到人们使用单独的表只是为了存储并行的身份密钥,所以一个表的身份密钥成为第二个表的辅助密钥,这听起来有点狡猾,但也许是这样的实现到位的情况? 编辑2:此额外的 ID是旧文档参考,标记每个文件/记录。我猜想它可能是主ID的特殊别名。 在过去的20年中,该数据库每年处理的记录数没有超过100,并且极有可能(确实非常高),当然,如果超过99,该字段将能够继续使用多余的数字,前端/过程将能够超过99,因此它不会改变它。 当然,我一开始没有提到这些细节,因为它们只会缩小解决方案的可能性,以满足我的特定需求,并试图将问题范围扩大。

1
无法在ID处插入行,但行不存在
这是我面临的怪异问题。我正在尝试使用以下查询输入数据 insert into product_product (id, product_tmpl_id, make_equip, model_equip, name_template, serial_num_equip, location_equip, issue_date_equip, issue_to_equip, remarks_equip, pr, ch, categ_id,valuation) values (700,700,'Nikon','Action 10x50 Lookout','Nikon Action 10x50 Lookout','671386','40 Wall St.','5/13/2004 12:00:00 AM','','OM''s OFFICE',62,72,502,'manual periodic'); 我得到错误: ERROR: duplicate key value violates unique constraint "product_product_pkey" DETAIL: Key (id)=(700) already exists. ********** Error ********** ERROR: duplicate key …

2
MySQL-如果删除了最后一行,则自动递增不会自动递增
我有一个表,其中包含一个自动递增的主键ID。如果我删除最后一行(最高ID,例如id = 6)并插入新行,则新ID从7开始。我必须更改哪个参数,使主键从6开始? CREATE TABLE animals ( id MEDIUMINT NOT NULL AUTO_INCREMENT, name CHAR(30) NOT NULL, PRIMARY KEY (id) ) ENGINE=MyISAM; INSERT INTO animals (name) VALUES ('dog'),('cat'),('penguin'), ('lax'),('whale'),('ostrich'); 结果: id名称 1狗 2猫 3企鹅 4松懈 5鲸鱼 6鸵鸟 DELETE FROM animals WHERE id = 6; INSERT INTO animals (name) VALUES ('x'); 结果: …

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.