Questions tagged «primary-key»

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

4
mysql int vs varchar作为主键(InnoDB存储引擎?
我正在构建一个Web应用程序(项目管理系统),并且在性能方面一直想知道这一点。 我有一个Issues表,里面有12个外键链接到其他各种表。在其中的8个中,我需要加入才能从其他表中获取title字段,以便使记录在Web应用程序中有意义,但是,这意味着进行8个加入似乎非常繁琐,尤其是因为我只是在拉入这些联接中的每个联接都有1个字段。 现在,出于永久性的原因,我还被告知要使用自动递增的主键(除非考虑到分片,在这种情况下我应该使用GUID),但是在性能上使用varchar(最大长度为32)有多糟糕?我的意思是,这些表中的大多数可能不会有很多记录(其中大多数应该在20以下)。另外,如果我使用标题作为主键,则不必在95%的时间内进行联接,因此对于95%的sql,我什至会发生任何性能下降(我认为)。我唯一能想到的缺点是我将拥有更高的磁盘空间使用率(但是一天下来确实是一件大事)。 我将查找表用于很多此类而不是枚举的原因是因为我需要最终用户可以通过应用程序本身配置所有这些值。 将varchar用作不包含很多记录的表的主键有什么弊端? 更新-一些测试 因此,我决定对此做一些基本测试。我有100000条记录,这些是基本查询: 基本VARCHAR FK查询 SELECT i.id, i.key, i.title, i.reporterUserUsername, i.assignedUserUsername, i.projectTitle, i.ProjectComponentTitle, i.affectedProjectVersionTitle, i.originalFixedProjectVersionTitle, i.fixedProjectVersionTitle, i.durationEstimate, i.storyPoints, i.dueDate, i.issueSecurityLevelId, i.creatorUserUsername, i.createdTimestamp, i.updatedTimestamp, i.issueTypeId, i.issueStatusId FROM ProjectManagement.Issues i 基本INT FK查询 SELECT i.id, i.key, i.title, ru.username as reporterUserUsername, au.username as assignedUserUsername, p.title as projectTitle, pc.title as ProjectComponentTitle, …

2
如何在PostgreSQL中将现有索引提升为主键
我知道如何在表中创建主键,但是如何使现有索引成为主键?我正在尝试将现有表从一个数据库复制到另一个数据库。当我显示表格时,底部的索引采用以下形式: "my_index" PRIMARY KEY, btree (column1, column2) 我用以下方法创建了索引: CREATE INDEX my_index ON my_table (column1, column2) 但我不知道如何使其成为主键... 更新:我的服务器版本是8.3.3

2
如何在INSERT中处理auto_increment键(SELECT * FROM…)
我table1和table2MySQL中。两者都有一个主auto_increment键id。 如果表模式匹配,并且INSERT INTO table1 (SELECT * FROM table2)对插入到其中的新行该table1怎么办?难道他们保留他们原来的id价值和产生冲突时,从行table1具有相同的id?auto_increment是否生成新值?它取决于存储引擎还是锁定?

1
PostgreSQL中的多个主键
我有下表: CREATE TABLE word( word CHARACTER VARYING NOT NULL, id BIGINT NOT NULL, repeat INTEGER NOT NULL ); ALTER TABLE public.word OWNER TO postgres; ALTER TABLE ONLY word ADD CONSTRAINT "ID_PKEY" PRIMARY KEY (word,id); 当我尝试使用以下命令还原它时: psql -U postgres -h localhost -d word -f word.sql 它给了我这个错误: 不允许表“ word”使用多个主键 如何在postgres中使用多个主键?

4
5列以上的主键对大型(1亿+)表不利吗?
我正在阅读有关一些现实生活中的数据库问题的信息,一个项目有一个拥有1亿行的表格,其中有5列作为主要表格。我认为这很糟糕,但是有人可以告诉我原因吗? 该表有点像微型汇总/汇总表,因此5列是(天,market_id,product_id ...)。起初,我认为5列主键并不理想,但我想多了一点,我真的无法提出一个很好的理由来说明它不好。 这是在半夜与公司一半的工程师进行的讨论中。一位高级工程师同意,有人刚刚提到这是一个糟糕的设计,但没人真正了解原因。因此尝试自己研究问题!

2
复合主键效率作为外键
我有一个带有复合主键(由4列组成)的表,该键用于确保没有重复项输入到表中。我现在需要一个新表,该表需要将该表中的键作为外键引用。 我的问题是哪种方法对查找速度更有效: 1)我是否创建包括所有4列的新表,并在外键中引用它们。 要么 2)我是否在主键表中创建了一个新的标识列,并将其用作新表中的外键。 预计该数据库将存储大量数据,因此到目前为止,我已经建立了该数据库,以最大程度地减少每个表中存储的数据量。考虑到这一点,选项2将是最好的方法,因为我将为每行保存2个int列和一个datetime列,但是我想避免不必要的增加查找时间。

1
在CREATE TABLE…AS SELECT中自动递增主键
我通过使用复杂的选择查询创建了表格CREATE TABLE ... AS SELECT...。如何在此查询中添加自动增量主键? 例如: create table `user_mv` select `user`.`firstname` as `firstname`, `user`.`lastname` as `lastname`, `user`.`lang` as `lang`, `user`.`name` as `user_name`, `group`.`name` as `group_name` from `user` inner join `user_groups` on (`user`.`user_id`=`user_groups`.`user_id`) left join `group` on (`group`.`group_id`=`user_groups`.`group_id`) where `user`.`lang`=`group`.`lang` 此查询创建一个包含表firstname,lastname,lang,username,group_name列。我希望它也具有id作为自动增量主键的列。 有什么办法可以通过更改此查询来做到这一点?我知道我可以通过在执行此查询后更改表来做到这一点,但是如果有任何直接在create table语句中执行此操作的方法,我想知道如何执行此操作。


3
日志表应该获取id字段还是主键?
我有一个日志表,捕获某些文件导出到另一个系统时的日期时间戳。 目前,exportedLog表具有三个字段: id (primary key) messageId (int) exportedDateTime (datetime) 对此进行回顾,我发现该id字段没有任何作用,因为没有该表的联接。该表上唯一起作用的是插入批处理作业,该批处理作业处理消息并将其插入此日志表。 我应该删除该id字段吗? 我是否应该在任何一个主键messageId或exportedDateTime或两者兼而有之?

1
如何在mysql中的复合主键上进行INDEX?
当为两个或更多列创建复合主键时,例如PRIMARY KEY(col1, col2, col3);系统会分别对INDEX每一列进行吗? 我问这个问题的原因是,当我们使用时UNIQUE INDEX (col1, col2, col3),它仅充当INDEX第一列,而我们需要INDEX为其他列创建其他。我想知道复合主键是否也是如此。

3
电子邮件地址是唯一键还是主键?
我是数据库的新手。我四处阅读,发现使用电子邮件地址作为主键可能不是一个好主意,因为字符串比较慢,这会影响复杂连接中的性能;如果电子邮件发生更改,我必须更改所有外键,这需要很多工作努力。 但是,如果我的用户表要求每个用户都有一个电子邮件地址,并且每个电子邮件地址都应该是唯一的,那么在电子邮件列上添加唯一索引就足够了吗?因为afaik唯一字段允许空值,而我要求每个用户都有一个电子邮件地址,但不允许空值。我在这里想念什么吗?或者我想使电子邮件列唯一,并确保在服务器上的数据验证期间用户确实输入了电子邮件地址,以便每个用户都有一个电子邮件地址?

4
NVARCHAR列作为PRIMARY KEY或UNIQUE列
我正在开发SQL Server 2012数据库,并且对nvarchar列作为主键有疑问。 我有这张桌子: CREATE TABLE [dbo].[CODES] ( [ID_CODE] [bigint] IDENTITY(1,1) NOT NULL, [CODE_LEVEL] [tinyint] NOT NULL, [CODE] [nvarchar](20) NOT NULL, [FLAG] [tinyint] NOT NULL, [IS_TRANSMITTED] [bit] NOT NULL DEFAULT 0, CONSTRAINT [PK_CODES] PRIMARY KEY CLUSTERED ( [CODE_LEVEL] ASC, [CODE] ASC ) ) 但是现在我想使用[CODE]列作为主键并删除[ID_CODE]列。 如果我的NVARCHAR专栏为,是否有任何问题或惩罚PRIMARY KEY? [CODE]列值必须是唯一的,因此我认为可以UNIQUE为该列设置约束。 我必须用[CODE]作主键还是UNIQUE对[CODE]列设置约束会更好?

2
是否建议使用身份代替主键?
我们可以声明一个Identitylike,id_num这样id_num它将具有唯一编号的增量。 CREATE TABLE new_employees ( id_num int IDENTITY(1,1), fname varchar (20), minit char(1), lname varchar(30) ) 由于为每行提供了唯一的编号,因此建议使用它Identity作为替代方法吗?Primary keyIdentity


3
如何查找数据库中没有显式主键的所有表?
一次Google搜索发出了数百万点击的信息,说明如何查找没有聚集索引的表,而PK通常是表的聚集索引。但是,表可以轻松地将自然键用作聚簇索引,并具有非聚簇代理索引(例如标识列)。 如何在未定义主键的数据库中查找所有表?我在该数据库中有245个表:手动检查效率很低。

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.