Oracle SQL Inline NOT NULL命名约束

时间:2012-03-21 23:03:34

标签: sql oracle11g

如何在我的sql语句末尾指定NOT NULL约束,因为我可以使用UNIQUE

 CREATE TABLE test ( 
        WORKFLOW_CLASS_ID VARCHAR2(24),
        DEPT_OWNER VARCHAR2(3), 
        NAME VARCHAR2(64), 
        PRODUCT_ID VARCHAR2(24), 
        CONSTRAINT WF_WORKFLOW_CLASS_pk PRIMARY KEY (WORKFLOW_CLASS_ID), 
        CONSTRAINT dup_workflow UNIQUE (DEPT_OWNER, NAME), 
        CONSTRAINT not_null NOT NULL(PRODUCT_ID)) 

上面的创建字符串是使用XML文档中定义的模式动态构建的,该文档在自己的标记中定义了约束,因此我在sql字符串的最后处的约束。当我尝试指定NOT NULL时,我得到无效的标识符。

编辑: 下面是我的xml文档的结构。随着时间的推移,这个文件已经发展。我用它来生成DAO和Javabean样板代码,我将其剪切并粘贴到Eclipse中,并动态创建html表单(xml具有字段,大小和标签)。它还用于管理CRUD应用程序以维护后端。我最近添加了<tableConstraints>标记,因为我想添加UNIQUE约束;可以在create语句的末尾指定UNIQUE约束。在后面的视线中,我应该在<contraint>标记中添加<column>标记。

<!DOCTYPE schema PUBLIC "SchemaId" "../../schema.dtd">
<schema>
  <tableName>WF_WORKFLOW_CLASS</tableName>
  <javaBean>WorkflowClass</javaBean>
  <tableAlias>wfc</tableAlias>
  <tableTitle>Workflow process definitions by department</tableTitle>
  <tableConstraints>, CONSTRAINT dup_workflow UNIQUE (DEPT_OWNER, NAME), CONSTRAINT not_null NOT NULL(PRODUCT_ID)</tableConstraints>
  <oneToMany>
        <attName>work_item_list</attName>
        <attName>work_action_list</attName>
  </oneToMany>

  <column>
        <name>WORKFLOW_CLASS_ID</name>
        <type>VARCHAR2</type>
        <size>24</size>
        <label>Work flow Class Unique ID</label>
  </column>

  <primaryKey>      
        <name>WORKFLOW_CLASS_ID</name>
        <type>timestamp</type>
  </primaryKey>

  <foreignKey>
        <name>ADMIN_BY</name>
        <table>EBITPSV.PS_NAMES_V009</table>
        <lookUpKey>badge</lookUpKey>
        <returnField>lname</returnField>
  </foreignKey>

</schema>

1 个答案:

答案 0 :(得分:9)

each individual列名称之后声明内联的非空约束:

CREATE TABLE test ( ... 
        NAME VARCHAR2(64), 
        PRODUCT_ID VARCHAR2(24) not null,
        ... )

如果您希望name the constraint explicitly,那么您也可以在每列之后执行此操作:

CREATE TABLE test ( ... 
        NAME VARCHAR2(64), 
        PRODUCT_ID VARCHAR2(24)  
         CONSTRAINT PRODUCT_ID_NN NOT NULL,
        ... )

您可以在创建表后修改列:

ALTER TABLE test
 MODIFY product_id varchar2(24) not null;

更新

根据您最近发布的XML脚本判断,最好的办法是在您的<notNull>标记中添加子标记<column>。有2个值 - 例如1, 0您可以使用与判断某些内容是否为varchar相同的方式添加非空约束。

另一种方法是循环浏览<tableConstraints>代码中的值,并在创建表格后运行多个alter table add constraint ...alter table modify ...

您建议在<constraint>中添加<column>子标记并在列级别创建所有子标记仅适用于single column constraints而不是您需要的多个。