SQL声明主键或主键约束

3
在Oracle SQL中,将字段声明为PRIMARY KEY的区别是什么,如下所示:
CREATE TABLE my_tab (
my_var NUMBER PRIMARY KEY,
...

在表定义的末尾添加约束(CONSTRAINT)是什么意思?什么情况下应该使用一个而不是另一个?此外,在PRIMARY KEY之前是否需要包含NOT NULL?

我查找了一些资料,似乎找不到确切的答案,为什么我应该使用其中之一。希望有人能澄清一下。谢谢!


只想强调一件事情:无论你如何定义,主键都是一个约束。 - Andriy M
无论你采用哪种方式,都一定要给约束条件命名。 - David Aldridge
2个回答

8
在你的例子中没有区别:两种方法都会将my_var设置为主键。
不过,总体上还是有一些区别的。以下是我想到的两个:
1. 当你单独定义PRIMARY KEY作为一个CONSTRAINT时,你可以给这个约束命名,而使用内联的my_var ... PRIMARY KEY时,Oracle 会自动生成一个名称。
2. 当你单独定义PRIMARY KEY时,你可以定义由多个列组成的主键。
补充说明: 我错过了帖子中的这个问题:
“此外,在主键代码中是否需要包括NOT NULL?”
答案是:不需要包括,但请注意,Oracle 会自动将该列创建为NOT NULL,因为它不允许在主键值中使用null。以下是使用SQLPlus的示例:
SQL> CREATE TABLE c (col1 NUMBER PRIMARY KEY, col2 NUMBER);
Table created.

SQL> DESC c

Name  Null?    Type
----- -------- ------
COL1  NOT NULL NUMBER <-- Oracle automatically made this NOT NULL
COL2           NUMBER

即使您指定了NULL,Oracle也会自动更改为NOT NULL
SQL> CREATE TABLE d (col1 NUMBER NULL PRIMARY KEY, col2 NUMBER);
Table created.

SQL> desc d;
 Name  Null?    Type
 ----- -------- ------
 COL1  NOT NULL NUMBER <-- Oracle automatically made it NOT NULL again
 COL2           NUMBER

1
仅作澄清,Oracle不会在主键列上创建NOT NULL约束,但无法具有空值是主键约束本身的一部分。您在那里看到的是SQL * Plus DESCRIBE命令从主键约束的存在推断出该列不能为空。 - David Aldridge
谢谢@DavidAldridge - 你说得完全正确!我查询了USER_CONSTRAINTS,果然我的上面例子中的表C只显示了PK约束。 - Ed Gibbs
@DavidAldridge:有趣,这与SQL Server非常不同。我不确定在SQL Server中NULL / NOT NULL是约束还是列属性,但无论哪种情况,在删除约束后,由PRIMARY KEY约束隐含的NOT NULL仍然有效,此演示证明了这一点。 - Andriy M
@AndriyM 绝对不是 ANSI 覆盖的领域,我认为,所以供应商定义他们认为适当的任何行为。 - David Aldridge

2

约束条件的文档已经涵盖了这个问题。

第一种方法称为“内联”。第二种方法称为“非内联”。

它们之间只有一个真正的区别。如果您的主键有多个键,则需要使用“非内联”语法。否则,它们执行相同的操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接