用于创建表的最佳实践DDL是什么?单个语句包含所有对象或许多单独的语句创建和更改?

时间:2012-09-06 04:10:37

标签: sql oracle ddl

是否有最接近其中一个示例的最佳做法?

CREATE TABLE TABLE1 
(
ID   NUMBER(18)     CONSTRAINT TABLE1_PK PRIMARY KEY,
NAME VARCHAR2(10)   CONSTRAINT NAME_NN NOT NULL
);

CREATE TABLE TABLE1 
(
ID   NUMBER(18),
NAME VARCHAR2(10)   CONSTRAINT NAME_NN NOT NULL
);

ALTER TABLE TABLE1  ADD CONSTRAINT TABLE1_PK
PRIMARY KEY (ID)
USING INDEX (CREATE UNIQUE INDEX IDX_TABLE1_PK ON TABLE1 (ID));

这两种情况一般会导致更好的结果吗?第一种选择更具可读性,但也许有理由认为后者更可取。

3 个答案:

答案 0 :(得分:5)

绝对是个人偏好。我更喜欢在单CREATE TABLE语句中尽可能多地做,因为我发现它更简洁。我需要的大部分内容都在那里描述。

有时这是不可能的。假设您有两个表,每个表都有对每个表的引用,或者您希望首先加载包含大量数据的表,因此在加载表后添加其他索引。

你会发现许多从DB创建模式的工具会将它们分开(主要是因为它总是正确的 - 定义所有表,然后定义所有关系)。

但就个人而言,如果可行,我发现在一个地方拥有这一切是最好的。

答案 1 :(得分:5)

在构建最终将由其他人运行的部署脚本时,我更喜欢将脚本拆分一下。如果出现问题,从日志中判断究竟是什么失败会更容易。

我的表创建脚本通常只有NOT NULL约束。之后将添加PK,唯一和FK约束。

这是一个小问题,我没有特别反对在一个大的CREATE TABLE语句中将它们组合在一起。

您可能会发现您的工作场所已经有了标准。例如我当前的客户端需要单独的脚本用于CREATE TABLE,然后需要更多单独的脚本用于约束,索引等。

当然,例外是索引组织的表,它必须具有预先声明的PK约束。

答案 2 :(得分:0)

在实际的create语句中定义字段的任何属性或默认值是个人偏好。我注意到的一件事是你的第二个语句不起作用,因为你没有指定id字段是NOT NULL

我认为这是一个可读性的个人最佳实践,我预先指定了表的主键。

创建表时要考虑的另一件事是您希望如何识别,唯一或复合的项目。 ALTER TABLE适用于事后创建复合键。