SQL 外键缩写

SQL Foreign key abrevation

这些 T-SQL 声明是否相等?

CREATE TABLE Person
(
ID INT PRIMARY KEY,
NAME VARCHAR(60)
)

CREATE TABLE Dog
(
CHIP_ID INT PRIMARY KEY,
OWNER_ID INT REFERENCES Person(ID)
)

CREATE TABLE Person
(
ID INT PRIMARY KEY,
NAME VARCHAR(60)
)

CREATE TABLE Dog
(
CHIP_ID INT PRIMARY KEY,
OWNER_ID INT,
FOREIGN KEY(OWNER_ID) REFERENCES Person(ID)
)

我说的当然是外键,我不确定是否必须指定它是外键。

谢谢。

两者都 T-SQL 将创建您需要的外键。但是,我相信代码明确声明 "FOREIGN KEY..." 的第二种方法有助于保持易于维护和干净的代码,以便未来的软件工程师理解。

是的,DBMS 认为两者相同。但是,当代码含糊不清时,人类往往会错过重要的细节。其实我的偏好是这样的:

CREATE TABLE Person(
    ID     INT not null,
    Name   VARCHAR(60) not null,
    constraint PK_Person primary key( ID )
);

CREATE TABLE Dog(
    ID       INT not null,
    OwnerID  INT,
    constraint PK_Dog primary key( CHIP_ID ),
    constraint FK_Dog_Owner foreign key( OWNER_ID ) REFERENCES Person( ID )
);

使用constraint子句不仅可以定义主键和外键,还可以让我们给它们起一个有意义的名字。每个table的代理键应该命名为"ID"。其他 table 中的任何外键都会根据其上下文 (RoleID) 扩展该名称。正如您在 Dog table 和 OwnerID 中一样。另一个 table 对同一个人 table 有 FK 可以将其命名为 GroomerID 或任何其他显示该人在 table.[=16= 的上下文中扮演的角色的名称]

此外,如您所见,我更喜欢使用 SQL Server 的 CamelCase,为 Oracle 留下 OWNER_ID

有些甚至在每个列定义之后放置 NULL 或 NOT NULL。但我发现这会增加混乱,并且不会真正提供信息,即使 SQL 开发人员还不知道。所以我只在适当的时候提供 NOT NULL 并让默认携带。实际上,在更高版本的 Oracle 和 SQL Server 中,主键字段的 NOT NULL 是可选的,因为无论如何主键都将被定义为 NOT NULL。

很久以前,似乎有一场非正式的比赛,看谁能将最多的操作塞进最少的单词甚至字符中。只是远离那种想法。但是一定要让你写的一切都有意义。

一般来说,利用一切机会向代码中添加有意义的信息。电脑不在乎。写信给将关注您的其他开发人员。