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
.
并不重要
两种不同的方法有什么区别,包括主键约束的强制执行(在 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
.