在sql表创建中是否总是需要主键?

在sql表创建中是否总是需要主键?,sql,database,foreign-keys,primary-key,create-table,Sql,Database,Foreign Keys,Primary Key,Create Table,我不知道我是否在sql中正确创建了这些表。有人能确认我做的是正确的还是错误的吗?表只能有外键还是必须有主键?提前谢谢 CREATE TABLE Job( JobId integer, ToolName varchar(40), status varchar(100), start_time time, finish_time time PRIMARY KEY(JobId)); CREATE TABLE ErrorLog( JobId integer, ErrCode integer, Desc

我不知道我是否在sql中正确创建了这些表。有人能确认我做的是正确的还是错误的吗?表只能有外键还是必须有主键?提前谢谢

CREATE TABLE Job(
JobId integer,
ToolName varchar(40),
status varchar(100),
start_time time,
finish_time time
PRIMARY KEY(JobId));

CREATE TABLE ErrorLog(
JobId integer,
ErrCode integer,
Description varchar(200),
PRIMARY KEY(ErrCode)
FOREIGN KEY(JobId) REFERENCES Job(JobId));

CREATE TABLE BLAST(
input varchar(100),
database varchar(100),
evalue varchar(100),
JobId integer, 
FOREIGN KEY (JobId) REFERENCES Job(JobId));

CREATE TABLE MitoLoc(
input varchar(100),
specificity varchar(100),
JobId integer,
FOREIGN KEY (JobId) REFERENCES Job(JobId));

最佳做法是在SQL RDBMS中的表上创建主键列。尽管SQL不要求表具有主键

主键允许为表中的每一行设置唯一标识符。这是唯一标识表中特定行的方法,也是唯一利用外键关系的方法


数据库服务器(如SQL Server)在定义了主键后,也可以更好地优化表的存储和查询。

主键是一个很好的主意,但不是必需的。几乎我创建的每个表都有一个自动递增的主键。这是对我保留的其他几个专栏的补充,例如
CreatedAt
CreatedBy

外键关系通常与主键相关,但也可以与唯一键相关

为什么要主键

  • 因此,您可以轻松地删除重复的行
  • 因此,您可以随时更新一行
  • 自动递增的主键可以让您了解行插入表的顺序
  • 单列主键更容易处理外键引用
毫无疑问,还有其他原因。但这些只是少数


至于您的表,我认为
Mitoch
Blast
应该具有作为主键的id列。如果合适,您还可以将其他列(或组合)声明为唯一的。

不需要。但它不利于表结构。 您可以创建没有主键的表。它可以有外键。 但某些DBMS不允许在没有主键的情况下保存表 如果您不使用主键,则

  • 很难识别每个记录
  • 它的记录不能引用其他表

  • 在创建表结构时,有时必须创建组合主键,这意味着两个或多个列(组合)可以是主键

    它只能有一个FK而没有PK,如果不需要唯一的标识值,则可能与4年前询问的@ChrisPietschmann重复,但仍然相关。我不住在桥下。你认为我应该怎么处理我的BLAST和mitoloc表呢?最好在大多数表中添加一个“Id”列作为主键。如果你不想在每次插入时都设置“Id”,那么你可以将它设置为一个标识,这样它会自动为你设置。“重复”标志是指向另一个问题,该问题问的是同一件事,而不一定把这个问题说成是坏问题