Oracle - 哪个更可取,主键还是约束主键

Oracle - which preferable, primary key or constraint primary key

两种不同的方法有什么区别,包括主键约束的强制执行(在 table 级别)?

CREATE TABLE employee(
   empNum  number(6),
   empName varchar2(50),
   PRIMARY KEY (empNum, empName) --intentionally set
);

CREATE TABLE employee(
   empNum  number(6),
   empName varchar2(50),
   constraint empNum_PK primary key (empNum, empName)
);

完全没有区别——除了在你的第一个例子中 Oracle 必须命名约束(它会像 SYS_C008630 这样你不知道它代表什么),而你命名约束正如 empNum_PK 显示 它是主键。

还有一个选项:alter table:

SQL> create table employee(
  2    empNum   number(6),
  3    empName  varchar2(50));

Table created.

SQL> alter table employee add constraint empNum_PK primary key (empNum, empName);

Table altered.

SQL>

无论如何,仍然没有区别,因为它是主键。


如果是 外键 会有 差异 循环引用 在两个 table 之间(其中每个引用另一个)。没有 alter table 选项,您无法创建外键约束。

这显然行不通(因为引用的 table 尚不存在):

SQL> create table tab_2 (id_b   number primary key,
  2                      id_a   number constraint fk_21 references table_1 (id_a));
                    id_a   number constraint fk_21 references table_1 (id_a))
                                                              *
ERROR at line 2:
ORA-00942: table or view does not exist
 

但是,如果您先创建 tables,然后再创建外键,那么它就可以工作了:

SQL> create table tab_1 (id_a    number  primary key,
  2                      id_b    number);

Table created.

SQL> create table tab_2 (id_b   number primary key,
  2                      id_a   number);

Table created.

SQL> alter table tab_1 add constraint fk_12 foreign key (id_b) references tab_2 (id_b);

Table altered.

SQL> alter table tab_2 add constraint fk_21 foreign key (id_a) references tab_1 (id_a);

Table altered.

SQL>

最后,最终结果是一样的:所有这些 keys(主要的,如您的示例,或外国的,如我的示例)已创建并起作用.

最佳做法是什么?如果您正在准备一个安装脚本,您将 运行 在一些模式中,它会创建 tables、视图、约束……,然后考虑我的第二个示例:创建 table 首先,单独创建约束。除此之外,我认为您是在 CREATE TABLE 语句中创建约束还是使用 ALTER TABLE.

并不重要