2

在 Oracle SQL 中,将字段声明为 PRIMARY KEY 有什么区别

CREATE TABLE my_tab (
my_var NUMBER PRIMARY KEY,
...

并在表定义的末尾添加一个约束?什么时候应该使用一个而不是另一个?另外,上面的代码中是否需要在 PRIMARY KEY 之前包含 NOT NULL ?

我环顾四周,似乎找不到任何明确的答案来说明为什么我应该使用一个而不是另一个。希望有人可以澄清这一点。谢谢!

4

2 回答 2

7

就您的示例而言,没有区别:每个都将成my_var为主键。

也就是说,存在一些普遍的差异。想到的两个:

  1. 当您将PRIMARY KEY单独定义为 aCONSTRAINT时,您可以为约束分配一个名称,而使用内联my_var ... PRIMARY KEYOracle 将生成一个名称。

  2. 当您PRIMARY KEY单独定义时,您可以定义由多个列组成的 PK。


附录:我在帖子中错过了这个问题:

另外,上面的代码中是否需要在 PRIMARY KEY 之前包含 NOT NULL ?

答案是:它不需要包含在内,但请注意 Oracle 会自动创建列,NOT NULL因为它不允许 PK 值中出现空值。这是一个使用示例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
于 2013-04-16T18:05:37.020 回答
2

关于约束的文档确实涵盖了这一点。

第一种方法称为“内联”。第二种叫做“出格”。

只有一个真正的区别。如果您的主键有多个键,那么您需要使用“out of line”语法。否则,他们会做同样的事情。

于 2013-04-16T18:05:15.563 回答