用PowerDesigner生成自定义建表语句

原文:用PowerDesigner生成自定义建表语句

  我们经常用PowerDesigner来进行数据库表结构的设计,并且设计出来的表比较直观的看出之间的相互关系,方便理解;但其自动生成的脚本并不一定符合我们实际需求,所以需要经过一定配置后才能真正达到要求,下面用一个简单的案例来学习如何配置PD。

需求:

  这里假设数据库代码版本维护是通过sql脚本文件来管理的,构造可重复执行的创建表、添加字段、索引等

  用PowerDesigner生成符合自己实际需求的脚本,要求如下

  1.建表语句可重复执行

  2.表名要有中文注释

  3.在PD里外键关联不体现在生成脚本里

  4.主键、外键等可以自定义命名

测试表:

  学生表(Student)和班级表(Classes)

PD设计如下:

 

自动生成脚本:  

if exists (select 1
   from sys.sysreferences r join sys.sysobjects o on (o.id = r.constid and o.type = 'F')
   where r.fkeyid = object_id('School_Student') and o.name = 'FK_SCHOOL_S_REFERENCE_SCHOOL_C')
alter table School_Student
   drop constraint FK_SCHOOL_S_REFERENCE_SCHOOL_C
go

if exists (select 1
            from  sysobjects
           where  id = object_id('School_Classes')
            and   type = 'U')
   drop table School_Classes
go

if exists (select 1
            from  sysobjects
           where  id = object_id('School_Student')
            and   type = 'U')
   drop table School_Student
go

/*==============================================================*/
/* Table: School_Classes                                        */
/*==============================================================*/
create table School_Classes (
   ID                   int                  not null,
   Name                 nvarchar(20)         null,
   CreateTime           datetime             null default getdate(),
   constraint PK_SCHOOL_CLASSES primary key (ID)
)
go

/*==============================================================*/
/* Table: School_Student                                        */
/*==============================================================*/
create table School_Student (
   ID                   int                  not null,
   Name                 nvarchar(20)         null,
   ClassID              int                  null default 0,
   Age                  tinyint              null default 0,
   StuNo                nvarchar(10)         null,
   Remark               nvarchar(500)        null,
   constraint PK_SCHOOL_STUDENT primary key (ID)
)
go

alter table School_Student
   add constraint FK_SCHOOL_S_REFERENCE_SCHOOL_C foreign key (ClassID)
      references School_Classes (ID)
go

View Code

  从上面脚本可以看出

  第一每次表存在都会先drop然后在create,在自动升级脚本里容易造删除真实表;

  第二图上班级编号是外键,但这里假设只是为了方便查看关系,真实情况下可能我们并不需要生成外键关系;

  第三如果当表名很长的时候,主键也会被截断显示或不是我们期望的格式

  所以虽然表设计好了,但要签入数据库脚本的话,自己还是需要进行一定的修改,下面我们一步步来实现自定义配置以达到要求

自定义配置PD

  1.去掉脚本中的外键关联

  1)双击表结构,如下图所示去掉create foreign key和drop foreign key,然后点应用,你会发现Preview中外键相关脚本已经没有了

 

  2.去掉自动生成的表注释,换成自定义的

  1)依次点击数据库->Generate Database->Format去掉Title前面的勾,这时候自定生成的注释已经没了,下一步添加自定义注释;

  2)依次点击数据库->Edit Current DBMS->Script->Objects->Table->Create,加上如下图所示脚本,这时候Preview已经有这段注释了

  3.让建表语句可以重复执行,如if not exists create这样

  1)去掉自带drop table操作,通过1.1中Show Generation Options中,去掉drop table勾就可以了;

  2)加上自定义重复脚本判断语句,还是刚才2.2图所在Table->Create地方,修改Value值如下图

  4.自定义主、外键名称

  1)位置如下,其中PK_%.U27:TABLE%就是主键的规则名称,U27就是长度最多只能是27位,TABLE就是表名,修改这里即可改变主键的生成规则

通过上面配置后,最终生成的SQL脚本就是按我们设想的来了,如下

/*
    表名:班级表
*/
if not exists (select 1
            from  sysobjects
           where  id = object_id('School_Classes')
            and   type = 'U')
begin
    create table School_Classes (
       ID                   int                  not null,
       Name                 nvarchar(20)         null,
       CreateTime           datetime             null default getdate(),
       constraint PK_SCHOOL_CLASSES primary key (ID)
    )

end
go

/*
    表名:学生表
*/
if not exists (select 1
            from  sysobjects
           where  id = object_id('School_Student')
            and   type = 'U')
begin
    create table School_Student (
       ID                   int                  not null,
       Name                 nvarchar(20)         null,
       ClassID              int                  null default 0,
       Age                  tinyint              null default 0,
       StuNo                nvarchar(10)         null,
       Remark               nvarchar(500)        null,
       constraint PK_SCHOOL_STUDENT primary key (ID)
    )

end
go

View Code

  其实对于自定义脚本,大家应该发现大部分都是通过数据库->Edit Current DBMS->Script->Objects来定义的,如Table来定义表,Column来定义列,很多功能只要去尝试修改下就能知道了。

时间: 2024-11-01 05:53:04

用PowerDesigner生成自定义建表语句的相关文章

使用dbms_metadata生成建表语句

有时候在工作中,可以使用exp/imp得到表的创建语句. 如果想得到关于table,index,constraint的语句,可以考虑使用dbms_metadata来实现. 我们可以使用如下的脚本来得到建表语句,对应的索引语句,和ref_constraint语句. 建表语句就不多说了,关于索引的部分,过滤了主键和唯一性索引的部分,这些语句会和建表语句中的constraint有一定的冲突,而foreign key的语句在建表语句中也不建议使用,这样会对其他表产生依赖,可以考虑单独生成这部分的语句,最

如何查看Oracle数据表的建表语句

oracle|数据|语句 如何查看Oracle数据表的建表语句? 系统环境:  1.操作系统:Windows 2000 Server,机器内存128M 2.数据库: Oracle 8i R2 (8.1.6) for NT 企业版 3.安装路径:C:\ORACLE 实现步骤:  1.用EXP工具导出 2.导入时使用show=y选项.log选项 3.查看.编辑日志文件 具体实例:  1.调出SQL*Plus conn system/manager grant connect,resource to

如何查看Oracle数据表的建表语句?

oracle|数据|语句 如何查看Oracle数据表的建表语句? 系统环境:  1.操作系统:Windows 2000 Server,机器内存128M 2.数据库: Oracle 8i R2 (8.1.6) for NT 企业版 3.安装路径:C:\ORACLE 实现步骤:  1.用EXP工具导出 2.导入时使用show=y选项.log选项 3.查看.编辑日志文件 具体实例:  1.调出SQL*Plus conn system/manager grant connect,resource to 

MySQL 建表语句

问题描述 CREATETABLEorder(IDintauto_increment,CODEchar(15)notnull,DATE_TIMEdatetimenotnull,RECEIVERvarchar(10)notnull,TELvarchar(13)notnull,CARDvarchar(20)notnull,EMAILvarchar(20),ADDRESSVARCHAR(80)notnull,constraintT_ORDER_FKprimarykey(ID));我是个初学者,这个建表语

Oracle Pl/Sql 查看建表语句

点击打开链接

为什么我用hibernate建表会出现如此诡异的情况?

问题描述 最近在学着用anotation配置hibernate,结果发现一些诡异的情况--实体类:ackage com.yyz.beans;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.ManyToOne;import ja

直接从SQL语句问题贴子数据建表并生成建表语句的存储过程

存储过程|数据|问题|语句 下面的存储过程,可帮你在回答SQL语句问题时,直接从贴子的样本数据建表并生成建表语句,省去大量的手工输入数据的工作. /*Create Table from your web page data* 2004-JAN-1, OpenVMS,V0.1* 2004-JAN-2, V0.5, add tab & blank values logical * 2004-JAN-3, V1.0, add SQL Statement generation * 2004-JAN-4,

基于ORACLE数据库的循环建表及循环创建存储过程的SQL语句实现

一.概述 在实际的软件开发项目中,我们经常会遇到需要创建多个相同类型的数据库表或存储过程的时候.例如,如果按照身份证号码的尾号来分表,那么就需要创建10个用户信息表,尾号相同的用户信息放在同一个表中. 对于类型相同的多个表,我们可以逐个建立,也可以采用循环的方法来建立.与之相对应的,可以用一个存储过程实现对所有表的操作,也可以循环建立存储过程,每个存储过程实现对某个特定表的操作. 本文中,我们建立10个员工信息表,每个表中包含员工工号(8位)和年龄字段,以工号的最后一位来分表.同时,我们建立存储

有关数据库建表的一个问题,感觉很头疼 直接上图

问题描述 建表的语句create table meeting(meetingid int primary key,roomid int,userid int,theme varchar(20),startdate timestamp,record varchar(400),enddate timestamp,foreign key(roomid) references meetindroom(roomid),foreign key(userid) references zhq_users(uid