今天发生了一些奇怪的事情,我的朋友(开发人员)说它可能是一个错误......通常当我想在PL / SQL中看到表的DDL时,我右键单击表然后我点击视图然后我得到了DDL。
但是,还有另一种方法可以获取表的DDL,右键单击表,然后有一个名为DBMS_METADATA的东西,然后我把光标放在它上面它会告诉我DDL。在我上传的图像中,DBMS_METADATA和'view'之间存在差异.Number 1表示'view',2表示DBMS_METADATA,如果您注意到两者之间存在巨大差异。第一个显示列organization_code它不为null(因为它未被检查)但第二个显示organization_code为null。这让开发人员感到困惑,他们应该指望哪一个? 。但是在测试列之后它不为空。我应该提一下,列是一个主键,所以它应该是NOT null为什么在medata中显示错误的信息?那之前发生过这种情况吗?(顺便说一句,我使用的是11g)
答案 0 :(得分:2)
用于主键的列不能为null 1 。但是,该限制只能通过主键约束来强制执行,并且不需要单独的非空约束。 IDE PL / SQL Developer向您展示了主键约束而非空约束的一般更有用的组合。 DBMS_METADATA正在向您显示指定表的确切方式,除非您计划删除主键,否则这是无关紧要的。
create table table1(a number not null primary key);
create table table2(a number primary key);
begin
dbms_metadata.set_transform_param(dbms_metadata.session_transform,
'SEGMENT_ATTRIBUTES',false);
end;
/
select dbms_metadata.get_ddl('TABLE', 'TABLE1') from dual;
CREATE TABLE "JHELLER"."TABLE1"
( "A" NUMBER NOT NULL ENABLE,
PRIMARY KEY ("A") ENABLE
)
select dbms_metadata.get_ddl('TABLE', 'TABLE2') from dual;
CREATE TABLE "JHELLER"."TABLE2"
( "A" NUMBER,
PRIMARY KEY ("A") ENABLE
)
在PL / SQL Developer中,两列都没有检查Nullable。
1除非您使用未经验证的非唯一索引,这是非常罕见的。