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。
很久以前,似乎有一场非正式的比赛,看谁能将最多的操作塞进最少的单词甚至字符中。只是远离那种想法。但是一定要让你写的一切都有意义。
一般来说,利用一切机会向代码中添加有意义的信息。电脑不在乎。写信给将关注您的其他开发人员。
这些 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。
很久以前,似乎有一场非正式的比赛,看谁能将最多的操作塞进最少的单词甚至字符中。只是远离那种想法。但是一定要让你写的一切都有意义。
一般来说,利用一切机会向代码中添加有意义的信息。电脑不在乎。写信给将关注您的其他开发人员。