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的基本功能,你也試試吧>>>