Ir para conteúdo
Fórum Script Brasil
  • 0

Conversão PostgreSQL para MySQL


paulobergo

Pergunta

Olá pessoal!

Estou adaptando o código php "linux" para "iis" de um sistema público de protocolo com banco PostgreSQL e precisarei passar a estrutura das tabelas para um banco MySQL.

Podem me passar uma dica de como ficaria um esquema do PostgreSQL no MySQL? Um Exemplo do esquema atual, é este:

create table p_fisicas(
        pessoas_codobj        integer primary key,
        nome            char(70),
        sexo            char(1) check (sexo ~ '[MF]'),
        estado_civil        varchar(15),
        escolaridade        varchar(49),
        localidade_codobj    integer references localidade(codobj),
        nome_pai        varchar(70),
        nome_mae        varchar(70),
        email            varchar(255),
        cnpf            char(11) null unique,
        data_nascimento        date,
        rg            char(20),
        rg_orgao_exp        char(5),
        rg_data_expedicao    date,
    eh_servidor        boolean default 'f',
        excluido        boolean default 'f',
        foreign key (pessoas_codobj) references pessoas (codobj)
);

create function p_fisicas_atualizacao()
returns opaque as '
        begin
        update pessoas set tipo = ''F'' where codobj = new.pessoas_codobj;
        return null;
        end;
'language 'plpgsql';

create trigger p_fisicas_insert
after insert on p_fisicas
for each row execute procedure p_fisicas_atualizacao();

Apesar de não ser da minha parte a definição das tabelas, gostaria de saber como ficaria a estrutura dessas tabelas e procedures (e se existe possibilidade de equivalência) no MySQL...

Grato! abraços!

Editado por paulobergo
Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

Oi, 'paulobergo'!

Ficaria assim:

create table p_fisicas(
        pessoas_codobj        integer,
        nome            char(70),
        sexo            enum('M','F') not null,
        estado_civil        varchar(15),
        escolaridade        varchar(49),
        localidade_codobj    integer,
        nome_pai        varchar(70),
        nome_mae        varchar(70),
        email            varchar(255),
        cnpf            char(11) not null,
        data_nascimento        date,
        rg            char(20),
        rg_orgao_exp        char(5),
        rg_data_expedicao    date,
    eh_servidor        enum('v','f') not null default 'f',
        excluido        enum('v','f') not null default 'f',
        constraint foreign key (pessoas_codobj) references pessoas (codobj),
                          unique key (cnpf),
                          primary key (pessoas_codobj)
)ENGINE = <engine-sendo usada>;

DELIMITER $$;

DROP TRIGGER `nome-do-banco`.`p_fisicas_insert`$$

create trigger `p_fisicas_insert` AFTER INSERT on `p_fisicas` 
for each row BEGIN
        update pessoas set tipo = "'F" where codobj = new.pessoas_codobj;
END;
$$

DELIMITER;$$

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Denis!

Grato pela pronta-resposta...

Vou já converter o código completo!

Grato! abraços!

Link para o comentário
Compartilhar em outros sites

  • 0

Olá pessoal!

Bom... comecei a "tradução" postgres->mysql...

O código a seguir vai indo bem... porém, na hora de executar a criação da tabela "p_jurídicas",

recebo uma mensagem de erro:

Welcome to the MySQL monitor.  Commands end with; or \g.
Your MySQL connection id is 13 to server version: 5.0.27-community-nt

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> use protocolo;
Database changed
mysql> show tables;
+---------------------+
| Tables_in_protocolo |
+---------------------+
| atividade           |
| pessoas             |
| telefone            |
+---------------------+
3 rows in set (0.00 sec)

mysql> create table `p_juridicas` (
    -> pessoas_codobj     integer,
    -> nome               varchar(70) not null default '',
    -> fantasia           varchar(50) not null default '',
    -> cnpj               varchar(14) not null default '00000000000000',
    -> inscricao_estadual varchar(15) not null default '',
    -> email              varchar(64) not null default '',
    -> senha              varchar(10) not null default '**********',
    -> atividade1_codobj  integer references atividade (`codobj`),
    -> atividade2_codobj  integer references atividade (`codobj`),
    -> outras_atividades  varchar(64) not null default '',
    -> excluido           tinyint not null default '0',
    -> ativo              tinyint not null default '1',
    -> constraint foreign key (pessoas_codobj) references pessoas (`codobj`),
    -> unique key(`cnpj`),
    -> primary key (`pessoas_codobj`)
    -> ) engine=InnoDb;
ERROR 1005 (HY000): Can't create table '.\protocolo\p_juridicas.frm' (errno: 150
)
mysql>_
Eis aí o esquema (parte dele, até o ponto em que "empaquei")...
create table `pessoas` (
codobj   integer unsigned not null auto_increment,
tipo     enum('f', 'j', 's', 'd', 'o') not null default 'f',
data     timestamp not null default current_timestamp on update current_timestamp,
excluido tinyint not null default '0',
primary key (`codobj`)
) engine=InnoDb;

create table `telefone` (
codobj        integer unsigned not null auto_increment,
pessoa_codobj integer references pessoas(codobj),
numero        varchar(15) not null default '',
principal     tinyint not null default '0',
primary key (`codobj`)
) engine=InnoDb;

create table `atividade` (
codobj   integer unsigned not null auto_increment,
nome     varchar(70) not null default '',
id       varchar(70) not null default '',
excluido tinyint not null default '0',
primary key (`codobj`)
) engine=InnoDb;

create table `p_juridicas` (
pessoas_codobj     integer,
nome               varchar(70) not null default '',
fantasia           varchar(50) not null default '',
cnpj               varchar(14) not null default '00000000000000',
inscricao_estadual varchar(15) not null default '',
email              varchar(64) not null default '',
senha              varchar(10) not null default '**********',
atividade1_codobj  integer references atividade (`codobj`),
atividade2_codobj  integer references atividade (`codobj`),
outras_atividades  varchar(64) not null default '',
excluido           tinyint not null default '0',
ativo              tinyint not null default '1',
constraint foreign key (pessoas_codobj) references pessoas (`codobj`),
unique key(`cnpj`),
primary key (`pessoas_codobj`)
) engine=InnoDb;

create function p_juridicas_atualizacao()
returns opaque as '
        begin
        update pessoas set tipo = ''J'' where codobj = new.pessoas_codobj;
        return null;
        end;
'language 'plpgsql';
O equivalente "postgre" é, até este ponto:
create table pessoas(
    codobj                  serial primary key,
    tipo            char(1) check (tipo ~ '[FJSDO]'),
    data                    timestamp default current_timestamp,
    excluido                boolean default 'F'
);

create table telefone(
    codobj            serial primary key,
    pessoa_codobj        integer references pessoas(codobj),
    numero            varchar(15),
    principal        boolean default 'F'
);

create table atividade(
        codobj                  serial primary key,
        nome                    varchar(70),
        id                      varchar(70),
        excluido                boolean default 'f'
);

create table p_juridicas(
        pessoas_codobj        integer primary key,
        nome            varchar(70),
        fantasia        varchar(50),
        cnpj            char(14) unique null,
        inscricao_estadual    varchar(15),
        email            varchar(255) unique null,
    senha            char(10),
    atividade1_codobj    integer null references atividade,
    atividade2_codobj    integer null references atividade,
    outras_atividades    varchar(70),
        excluido        boolean default 'F',
    ativo            boolean default 'T',
        foreign key (pessoas_codobj) references pessoas (codobj)
);

Como a Paula Toller, "onde foi que eu errei?"

Grato pelas dicas!!!

Link para o comentário
Compartilhar em outros sites

  • 0

Oi, 'paulobergo'!

Já comentei sobre este tipo de erro em outro tópico.

Verifique se ocorreu um dos erros abaixo:

Você tentou criar uma referência a uma tabela que não foi criada ainda, ou seja criou a tabela p_jurídicas antes de criar a tabela atividade;

Na tabela atividade o campo codobj não foi definido como primary key;

Os campos p_jurídicas.atividade1_codobj e atividade.codobj não foram definidos exatamente iguais (mesmo tipo, sinalização. tamanho e validação quanto a nulidade do campo.);

Analisando o texto verifiquei que:

Em create table `atividade` você definiu codobj assim codobj integer unsigned not null auto_increment, e na tabela p_jurídicas você definiu campos atividade1_codobj e atividade2_codobj assim:

atividade1_codobj  integer references atividade (`codobj`),
atividade2_codobj  integer references atividade (`codobj`),
. O correto deveria ser assim:
atividade1_codobj  integer unsigned default 0,
atividade2_codobj  integer unsigned default 0,
e mais abaixo, perto da criação de índices, você deve fazer como esta linha
constraint foreign key (atividade1_codobj) references atividade (`codobj`),
constraint foreign key (atividade2_codobj) references atividade (`codobj`),

Tente novamente e reporte sucesso ou fracasso.

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Denis...

Grato pelas dicas (que funcionarão)...

Agora, depois de muitas tabelas e triggers criados, deparei com mais alguma coisa...

create function numprocesso(integer,integer,integer)
returns int4 as
    'select numprocesso from controle where ano = $1 and mes = $2 and dia = $3;'
language 'sql';

create function codpessoa()
returns bigint as
        'select last_value from pessoas_codobj_seq'
language 'sql';

create function codprocesso()
returns bigint as
        'select last_value from processos_codobj_seq'
language 'sql';

CREATE FUNCTION processo_numprocesso () RETURNS "trigger"
    AS '
        declare
                _codprocesso integer;
                _numprocesso integer;
                _dia integer;
                _mes integer;
                _ano integer;
        begin
                if new.numprocesso isnull
                then
                        _codprocesso := new.codobj;
                        _dia := new.dia;
                        _mes := new.mes;
                        _ano := new.ano;
                        if not exists (select numprocesso from controle
                        where ano = _ano and mes = _mes and dia = _dia)
                        then
                                insert into controle (dia,mes,ano,numprocesso)
                                values(_dia,_mes,_ano,1);
                                update processos set numprocesso = 1
                                where codobj = _codprocesso;
                        else
                                update controle set numprocesso = numprocesso+1
                                where ano = _ano and mes = _mes and dia = _dia;
                                _numprocesso := numprocesso(_ano,_mes,_dia);
                                update processos set numprocesso = _numprocesso
                                where codobj = _codprocesso;
                        end if;
                        return null;
                else
                        return null;
                end if;
        end;
' LANGUAGE plpgsql;

CREATE TRIGGER processo_insert
    AFTER INSERT ON processos
    FOR EACH ROW
    EXECUTE PROCEDURE processo_numprocesso ();

E' possível (e é vantajoso) criar também essas funções e procedures no banco (em troca de fazê-lo no código da aplicação)?

Mais uma vez... grato!

Link para o comentário
Compartilhar em outros sites

  • 0

Oi, 'paulobergo'!

E' possível (e é vantajoso) criar também essas funções e procedures no banco (em troca de fazê-lo no código da aplicação)?

É possível.

A vantagem é poder usar o mesmo código em aplicações diferentes.

A desvantagem é a que você está passando agora. Ou seja, na portabilidade do banco. Quando muda o banco é que é o problema.

Particularmente eu gosto de manter as rotinas em locais próprios. Ou seja as rotinas de banco no banco e as rotinas de programa no programa. Sou fã de SP, functions e triggers, pois aumentam a funcionalidade a rapidez, além de proporcionar o encapsulamento correto para a rotina. Outro benefício de manter o código de banco no servidor é evitar o tráfego de dados desnecessários entre o cliente e o servidor (o que aconteceria se esta rotina estivesse no programa).

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...