powerDesigner的使用:
功能1:
不同的数据库可以进行表的相互转换存储。
例如:将oracle中的表在mysql中进行创建。
功能2:
在数据库第三方的可视化界面中有查看表与表之间的关系以及表的结构信息。
powerDesigner进行数据库设计:
第一步:使用管理员身份运行。
第二步:创建数据库物理模型。
第三步:在工作空间中创建数据表并设计表。
第四步:创建表与表之间的连接关系。
第五步:将物理模型导出为sql脚本文件,最后在数据库中执行即可(有了pdm文件相当于有了数据库所有的表)。
powerDesigner的物理模型转换成mysql表结构:
第一步:将oracle数据库中现有的表转换成pdm文件
第二步:File--->Reverse Engineer--->Database
第三步:配置mysql数据库的数据源
第三步:使用配置好的mysql数据源导出sql语句
powerDesigner起步
点击File右键>New Model:
点击物理数据模型,填写模型名、数据库版本:
点击ok,如果不小心选错了,也不要紧,可以在Database选项卡中重新编辑。
接下来将产生模型名称、表的工具栏:
工具栏可以建表:
填写表名称:
Columns编辑表
选中右键>属性
可以添加序列:
给序列命名:
给序列定义:
查看序列生成:
生成序列的sql语句显示如下:
可以点击表再添加个字段(项目经理Id):
可以看一下表结构:
再建一个项目经理表:
项目经理表字段:
现在有两个表了:
此时点击reference,可以建立两个表间,相同字段的主外键关系(带fk的都是从表):
此时双击箭头可以对reference进行编辑:
此时就可以保存了,可以ctrl+s,即可另存为pdm文件:
保存于桌面即可
接着可以根据模型来生成sql语句:
选择在桌面生成sql即可:
可以看到桌面上生成了sql文件:
打开crebas.sql
/*==============================================================*/ /* DBMS name: ORACLE Version 10g */ /* Created on: 2020/4/6 4:00:38 */ /*==============================================================*/ -- Type package declaration create or replace package PDTypes as TYPE ref_cursor IS REF CURSOR; end; -- Integrity package declaration create or replace package IntegrityPackage AS procedure InitNestLevel; function GetNestLevel return number; procedure NextNestLevel; procedure PreviousNestLevel; end IntegrityPackage; / -- Integrity package definition create or replace package body IntegrityPackage AS NestLevel number; -- Procedure to initialize the trigger nest level procedure InitNestLevel is begin NestLevel := 0; end; -- Function to return the trigger nest level function GetNestLevel return number is begin if NestLevel is null then NestLevel := 0; end if; return(NestLevel); end; -- Procedure to increase the trigger nest level procedure NextNestLevel is begin if NestLevel is null then NestLevel := 0; end if; NestLevel := NestLevel + 1; end; -- Procedure to decrease the trigger nest level procedure PreviousNestLevel is begin NestLevel := NestLevel - 1; end; end IntegrityPackage; / drop trigger "CompoundDeleteTrigger_coder" / drop trigger "CompoundUpdateTrigger_coder" / drop trigger "tib_coder" / drop trigger "CompoundInsertTrigger_coder" / alter table "coder" drop constraint FK_CODER_REFERENCE_PRO_MAN / drop table "coder" cascade constraints / drop table "pro_man" cascade constraints / drop sequence "Sequence_2" / drop sequence "Sequence_3" / drop sequence "coder_seq" / create sequence "Sequence_2" / create sequence "Sequence_3" / create sequence "coder_seq" increment by 1 start with 1 maxvalue 999 minvalue 1 cache 20 / /*==============================================================*/ /* Table: "coder" */ /*==============================================================*/ create table "coder" ( "cId" NUMBER(10) not null, "cname" varchar2(20), "pmId" number(10), constraint PK_CODER primary key ("cId") ) / /*==============================================================*/ /* Table: "pro_man" */ /*==============================================================*/ create table "pro_man" ( "pmId" number(10) not null, "pmName" varchar2(20), constraint PK_PRO_MAN primary key ("pmId") ) / alter table "coder" add constraint FK_CODER_REFERENCE_PRO_MAN foreign key ("pmId") references "pro_man" ("pmId") / create trigger "CompoundDeleteTrigger_coder" before delete on "coder" for each row declare integrity_error exception; errno integer; errmsg char(200); dummy integer; found boolean; begin -- Errors handling exception when integrity_error then raise_application_error(errno, errmsg); end; / create trigger "CompoundUpdateTrigger_coder" before update of "cId", "pmId" on "coder" for each row declare integrity_error exception; errno integer; errmsg char(200); dummy integer; found boolean; seq NUMBER; begin seq := IntegrityPackage.GetNestLevel; -- Errors handling exception when integrity_error then raise_application_error(errno, errmsg); end; / create trigger "tib_coder" before insert on "coder" for each row declare integrity_error exception; errno integer; errmsg char(200); dummy integer; found boolean; begin -- Column ""cId"" uses sequence coder_seq select coder_seq.NEXTVAL INTO :new."cId" from dual; -- Errors handling exception when integrity_error then raise_application_error(errno, errmsg); end; / create trigger "CompoundInsertTrigger_coder" before insert on "coder" for each row declare integrity_error exception; errno integer; errmsg char(200); dummy integer; found boolean; begin -- Column ""cId"" uses sequence coder_seq select coder_seq.NEXTVAL INTO :new."cId" from dual; -- Errors handling exception when integrity_error then raise_application_error(errno, errmsg); end; /
接着就是反转的过程:
命名模型,然后选择要反转的数据库版本:
点击Using a data source,然后点击右侧数据库小图标:
接着点configure(配置数据源):
点击Add Data Source:
选择系统数据源:
接着选Oracle in OraDb10g_home1(其实这一步是自动检测你的数据库版本,所以只有一个10g)
点完成:
接着需要填:
如果忘记了,可以登一下数据库:
完善数据源和服务信息、用户id:
数据源名自己起、TNS Service Name会自动匹配出服务名选择即可(就是数据库名),scott是用户名。
接着点测试连接:
连接上了:
接着点击OK:
接着就可以看到添加上一个数据源:
确定后可以回去选择数据源、填用户和密码、然后点击连接:
再返回即可,可以发现数据源自动匹配:
点击确定后会自动弹出一个框:
这样就可以选择要进行反转的表:
这样很明显看出来:有主外键关系的都可以自动连接,没有主外键关系的都独立。
箭头指向的都是主表,有的表既是主表又是从表,有的表同时是多个主表的从表。
可以看见功能很强大了吧,但是这不是最妙之处,
最奇妙的地方是可以把oracle数据库导过来的表传给mysql数据库,
下面就来做这件事。
点击Database选项卡:
接下来点Configure:
创建新数据源:
接下来配置msyql数据源时会出现问题:找不到mysql驱动,
powerdesigner需要32位的驱动才能连接mysql数据库。
Mysql驱动ODBC
所以我下载了mysql驱动,下载地址:
我下载的版本是:mysql32位5.2.7,没什么特别的就是随便选个版本,还是喜欢中间是偶数,但是必须是32位。
根据向导进行安装ODBC5.2驱动:
点接受:
下一步:
安装:
完成:
就是看一眼没什么用:
ODBC5.2已经安装好。
接下来去控制面板>搜索odbc>可以看到32位数据源:
点击32位添加数据源,需要将刚才安装好的数据源添加上去:
可以看到已经自动检测到这个驱动,选中安装即可:
只要自己的数据库用户密码都写对,就可以自动显示你的mysql数据库名称:
选择一个你常用的数据库名即可。
点击完成可以看到MYSQL的驱动已经生成:
接下来就可以回到powerdesigner里添加数据源,然后向mysql数据库导入数据。
下面就来做这件事。
以管理员身份运行:pdlegacyshell16.exe,
接着按照之前的流程再走一遍,
File--->Reverse Engineer--->Database:
点击确定:
点击图标:
点击configure:
可以看到已经显示MYSQL的ODBC驱动,需要点击小图标:
选择系数据源:
下一步,可以看到MySQL驱动,选择即可:
点完成:
和刚才一样,用户密码都填好之后据可以在下拉列表里选择数据库,如果没显示列表,
说明账号或密码填写错误:
点击测试后:
点击确定后,回到这里,我的MySQL数据库没设置密码:
点击连接即可,可以发现已经变成mysql的数据源:
接下来你可以把mysql的表导进来或者点击取消,
毕竟我的主要目产生mysql的sql文件。
点击Database>Change Current DBMS
DBMS选择MySQL5.0:
接着点确定即可:
显示:
点击确定,再次打开时,数据库已经变成Mysql数据库了:
现在就可以将模型转换成Mysql的sql文件:
Database>Generation>
点击确定后,就可以生成mysql文件:
再去桌面看一下:
mysql.sql
/*==============================================================*/ /* DBMS name: MySQL 5.0 */ /* Created on: 2020/4/6 19:40:07 */ /*==============================================================*/ drop table if exists SCOTT.DB_CITY; drop table if exists SCOTT.DB_CLASS; drop table if exists SCOTT.DB_COURSE; drop table if exists SCOTT.DB_CX; drop table if exists SCOTT.DB_SHENG; drop table if exists SCOTT.DB_STUDENT; drop table if exists SCOTT.DB_STUDENT_COURSE; drop table if exists SCOTT.DB_SYSTEM; drop table if exists SCOTT.DB_TREE; drop table if exists SCOTT.DB_USER; /*==============================================================*/ /* User: SCOTT */ /*==============================================================*/ create user SCOTT; /*==============================================================*/ /* Table: DB_CITY */ /*==============================================================*/ create table SCOTT.DB_CITY ( CITYID varchar(3) not null, CITYNAME varchar(20), SHENGID numeric(3,0), primary key (CITYID) ); /*==============================================================*/ /* Table: DB_CLASS */ /*==============================================================*/ create table SCOTT.DB_CLASS ( CLASSID varchar(32) not null, CLASSNAME varchar(20), primary key (CLASSID) ); /*==============================================================*/ /* Table: DB_COURSE */ /*==============================================================*/ create table SCOTT.DB_COURSE ( COURSEID varchar(32) not null, COURSENAME varchar(20), primary key (COURSEID) ); /*==============================================================*/ /* Table: DB_CX */ /*==============================================================*/ create table SCOTT.DB_CX ( CXID numeric(10,0) not null, CXNAME varchar(20), CAINO varchar(32), primary key (CXID) ); /*==============================================================*/ /* Table: DB_SHENG */ /*==============================================================*/ create table SCOTT.DB_SHENG ( SHENGID numeric(3,0) not null, SHENGNAME varchar(32), primary key (SHENGID) ); /*==============================================================*/ /* Table: DB_STUDENT */ /*==============================================================*/ create table SCOTT.DB_STUDENT ( STUNO numeric(4,0) not null, STUNAME varchar(20), BIRTHDAY datetime, CLASSID varchar(32), SHENGID numeric(3,0), CITYID varchar(3), primary key (STUNO) ); /*==============================================================*/ /* Table: DB_STUDENT_COURSE */ /*==============================================================*/ create table SCOTT.DB_STUDENT_COURSE ( STUNO numeric(4,0) not null, COURSEID varchar(32) not null, SCORE numeric(3,0), primary key (STUNO, COURSEID) ); /*==============================================================*/ /* Table: DB_SYSTEM */ /*==============================================================*/ create table SCOTT.DB_SYSTEM ( SYSID numeric(2,0) not null, SYSNAME varchar(20), primary key (SYSID) ); /*==============================================================*/ /* Table: DB_TREE */ /*==============================================================*/ create table SCOTT.DB_TREE ( TREEID varchar(32) not null, TREENAME varchar(20), TREENUM numeric(20,0), BIRTHDAY datetime, primary key (TREEID) ); /*==============================================================*/ /* Table: DB_USER */ /*==============================================================*/ create table SCOTT.DB_USER ( USERID varchar(20) not null, USERPASS varchar(6), USERNAME varchar(20), primary key (USERID) ); alter table SCOTT.DB_CITY add constraint SYS_C005829 foreign key (SHENGID) references SCOTT.DB_SHENG (SHENGID) on update restrict; alter table SCOTT.DB_STUDENT add constraint FK_STUDENT_CITY_CITYID foreign key (CITYID) references SCOTT.DB_CITY (CITYID) on update restrict; alter table SCOTT.DB_STUDENT add constraint FK_STUDENT_CLASS_CLASSID foreign key (CLASSID) references SCOTT.DB_CLASS (CLASSID) on update restrict; alter table SCOTT.DB_STUDENT add constraint FK_STUDENT_SHENG_SHENGID foreign key (SHENGID) references SCOTT.DB_SHENG (SHENGID) on update restrict; alter table SCOTT.DB_STUDENT_COURSE add constraint FK_SC_COURSE foreign key (COURSEID) references SCOTT.DB_COURSE (COURSEID) on update restrict; alter table SCOTT.DB_STUDENT_COURSE add constraint FK_SC_STUDENT foreign key (STUNO) references SCOTT.DB_STUDENT (STUNO) on update restrict;
这样就完成了oracle表转换成mysql表。
关键是mysql是否可以直接用这个sql呢?
试一下吧:
打开navicat:
打开数据库:
点击查询>粘贴>运行:
不过scott这个用户创建不了,索性把“create user scott”删掉,接着替换所有的"SCOTT."为“空”即可:
显示有错误,因为里面写着create user scott;:
create user SCOTT; [Err] 1396 - Operation CREATE USER failed for 'SCOTT'@'%'
在删除带有scott的词之后,就可以执行。
刷新后就有表结构:
好了,以上是powerdesigner的基本功能,你也试试吧>>>