Обсуждение: Mysql -> PgSQL

Поиск
Список
Период
Сортировка

Mysql -> PgSQL

От
"Ray Hunter"
Дата:
I am trying to convert a data type in mysql to postgresql and was wondering
which one i would use in pgsql.

the type is "set" (example):

name     set( 'val1', 'val2', 'val3' ) NOT NULL DEFAULT 'val2'

How can i do that in pgsql?



RAY HUNTER





Re: Mysql -> PgSQL

От
Bruce Momjian
Дата:
Ray Hunter wrote:
> I am trying to convert a data type in mysql to postgresql and was wondering
> which one i would use in pgsql.
>
> the type is "set" (example):
>
> name     set( 'val1', 'val2', 'val3' ) NOT NULL DEFAULT 'val2'
>
> How can i do that in pgsql?

Sure:

    x CHAR(4) NOT NULL DEFAULT 'val2' CHECK (x = 'val1' OR x = 'val2' ...)

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

Re: Mysql -> PgSQL

От
Tommi Maekitalo
Дата:
Am Mittwoch, 21. August 2002 20:18 schrieb Bruce Momjian:
> Ray Hunter wrote:
> > I am trying to convert a data type in mysql to postgresql and was
> > wondering which one i would use in pgsql.
> >
> > the type is "set" (example):
> >
> > name     set( 'val1', 'val2', 'val3' ) NOT NULL DEFAULT 'val2'
> >
> > How can i do that in pgsql?
>
> Sure:
>
>     x CHAR(4) NOT NULL DEFAULT 'val2' CHECK (x = 'val1' OR x = 'val2' ...)

Thats not so trivial. The type set can have "zero or more values, each of
which must be chosen from a list of allowed values" (from Mysql-manual). In
PostgreSQL you have to use a details-table for this. This is a nonstandard
feature of Mysql (these people concentrate in creating nonstandard extensions
before supporting the full standard ;-)

Tommi

Re: Mysql -> PgSQL

От
Bruce Momjian
Дата:
Tommi Maekitalo wrote:
> Am Mittwoch, 21. August 2002 20:18 schrieb Bruce Momjian:
> > Ray Hunter wrote:
> > > I am trying to convert a data type in mysql to postgresql and was
> > > wondering which one i would use in pgsql.
> > >
> > > the type is "set" (example):
> > >
> > > name     set( 'val1', 'val2', 'val3' ) NOT NULL DEFAULT 'val2'
> > >
> > > How can i do that in pgsql?
> >
> > Sure:
> >
> >     x CHAR(4) NOT NULL DEFAULT 'val2' CHECK (x = 'val1' OR x = 'val2' ...)
>
> Thats not so trivial. The type set can have "zero or more values, each of
> which must be chosen from a list of allowed values" (from Mysql-manual). In
> PostgreSQL you have to use a details-table for this. This is a nonstandard
> feature of Mysql (these people concentrate in creating nonstandard extensions
> before supporting the full standard ;-)

Oh, yes, it is enum that is CHECK.  'set' has multiple values.  It is a
nifty MySQL feature, I must say.

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

Re: Mysql -> PgSQL

От
Stephan Szabo
Дата:
On Thu, 22 Aug 2002, Tommi Maekitalo wrote:

> Am Mittwoch, 21. August 2002 20:18 schrieb Bruce Momjian:
> > Ray Hunter wrote:
> > > I am trying to convert a data type in mysql to postgresql and was
> > > wondering which one i would use in pgsql.
> > >
> > > the type is "set" (example):
> > >
> > > name     set( 'val1', 'val2', 'val3' ) NOT NULL DEFAULT 'val2'
> > >
> > > How can i do that in pgsql?
> >
> > Sure:
> >
> >     x CHAR(4) NOT NULL DEFAULT 'val2' CHECK (x = 'val1' OR x = 'val2' ...)
>
> Thats not so trivial. The type set can have "zero or more values, each of
> which must be chosen from a list of allowed values" (from Mysql-manual). In
> PostgreSQL you have to use a details-table for this. This is a nonstandard
> feature of Mysql (these people concentrate in creating nonstandard extensions

Another way (which is alot more involved but I guess marginally closer to
the mysql one) would involve making a function that takes two arrays and
makes sure that each element of the first is a member of the second (and
if set doesn't allow duplicates, that as well) and then do an array as
the column with a check constraint using the function.

All in all a details table is better, though. :)



Re: Mysql -> PgSQL

От
Tommi Maekitalo
Дата:
> > Thats not so trivial. The type set can have "zero or more values, each of
> > which must be chosen from a list of allowed values" (from Mysql-manual).
> > In PostgreSQL you have to use a details-table for this. This is a
> > nonstandard feature of Mysql (these people concentrate in creating
> > nonstandard extensions before supporting the full standard ;-)
>
> Oh, yes, it is enum that is CHECK.  'set' has multiple values.  It is a
> nifty MySQL feature, I must say.

But not so tricky as it looks first. They use just a bitmask for it. The
maximum number of allowed values is limited to 64 so it must be a 8-Byte
bitmask.

What do you think? Wouldn't it be nice to have this feature? It shouldn't be
too hard to implement it.

Tommi


Re: Mysql -> PgSQL

От
Jeff Davis
Дата:
Another question that comes to mind is: are there any plans to allow
user-defined types to accept argument lists? If that were the case, this
wouldn't be much of an issue, because anyone could just make a set type. As
it is, I think it needs to be added as a special case.

Regards,
    Jeff

On Thursday 22 August 2002 10:54 pm, Tommi Maekitalo wrote:
> > > Thats not so trivial. The type set can have "zero or more values, each
> > > of which must be chosen from a list of allowed values" (from
> > > Mysql-manual). In PostgreSQL you have to use a details-table for this.
> > > This is a nonstandard feature of Mysql (these people concentrate in
> > > creating nonstandard extensions before supporting the full standard ;-)
> >
> > Oh, yes, it is enum that is CHECK.  'set' has multiple values.  It is a
> > nifty MySQL feature, I must say.
>
> But not so tricky as it looks first. They use just a bitmask for it. The
> maximum number of allowed values is limited to 64 so it must be a 8-Byte
> bitmask.
>
> What do you think? Wouldn't it be nice to have this feature? It shouldn't
> be too hard to implement it.
>
> Tommi
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 2: you can get off all lists at once with the unregister command
>     (send "unregister YourEmailAddressHere" to majordomo@postgresql.org)


Re: Mysql -> PgSQL

От
Tommi Maekitalo
Дата:
Am Freitag, 23. August 2002 09:41 schrieb Jeff Davis:
> Another question that comes to mind is: are there any plans to allow
> user-defined types to accept argument lists? If that were the case, this
> wouldn't be much of an issue, because anyone could just make a set type. As
> it is, I think it needs to be added as a special case.
>
> Regards,
>     Jeff
>

That brings me to an idea. You can write a function, which converts a list of
strings to a bitmask and stores this value. Then it should be possible to
write something like

  insert into table(..., my_set) values (..., set('val1', 'val2', 'val3'))

as the original poster inteded to do. You need then a set of functions, for
queriing the values.

I'm not so familiar with udfs in postgresql. Is it possible to write udfs with
a variable number of arguments? Or is it possible to give a array-parameter
to a udf.

Mysqls set-type is still much more comfortable. Udfs is not a feature the
average Mysql-user wants to use.


Tommi

Re: Mysql -> PgSQL

От
Bruce Momjian
Дата:
What the SQL standard wants you to do with SETs is to create another
table to hold the codes, and another table to hold the relationships
between the master table rows and the values.

We do have an array type that may work in such cases, though the array
type is ordered and doesn't have pre-defined values for the elements.

---------------------------------------------------------------------------

Tommi Maekitalo wrote:
> Am Freitag, 23. August 2002 09:41 schrieb Jeff Davis:
> > Another question that comes to mind is: are there any plans to allow
> > user-defined types to accept argument lists? If that were the case, this
> > wouldn't be much of an issue, because anyone could just make a set type. As
> > it is, I think it needs to be added as a special case.
> >
> > Regards,
> >     Jeff
> >
>
> That brings me to an idea. You can write a function, which converts a list of
> strings to a bitmask and stores this value. Then it should be possible to
> write something like
>
>   insert into table(..., my_set) values (..., set('val1', 'val2', 'val3'))
>
> as the original poster inteded to do. You need then a set of functions, for
> queriing the values.
>
> I'm not so familiar with udfs in postgresql. Is it possible to write udfs with
> a variable number of arguments? Or is it possible to give a array-parameter
> to a udf.
>
> Mysqls set-type is still much more comfortable. Udfs is not a feature the
> average Mysql-user wants to use.
>
>
> Tommi
>
> ---------------------------(end of broadcast)---------------------------
> TIP 4: Don't 'kill -9' the postmaster
>

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

Re: Mysql -> PgSQL

От
Jeff Davis
Дата:
Yes, user defined functions can take arrays as arguments, and I think they can
take a variable number of arguments (after all, coalesce does).

And yes, MySQL's way is cleaner. I think the key is to allow user defined
types to take arguments, then all this stuff could go into a contrib module
and the functionality would be available with little effort.

Regards,
    Jeff

On Friday 23 August 2002 01:25 am, Tommi Maekitalo wrote:
> Am Freitag, 23. August 2002 09:41 schrieb Jeff Davis:
> > Another question that comes to mind is: are there any plans to allow
> > user-defined types to accept argument lists? If that were the case, this
> > wouldn't be much of an issue, because anyone could just make a set type.
> > As it is, I think it needs to be added as a special case.
> >
> > Regards,
> >     Jeff
>
> That brings me to an idea. You can write a function, which converts a list
> of strings to a bitmask and stores this value. Then it should be possible
> to write something like
>
>   insert into table(..., my_set) values (..., set('val1', 'val2', 'val3'))
>
> as the original poster inteded to do. You need then a set of functions, for
> queriing the values.
>
> I'm not so familiar with udfs in postgresql. Is it possible to write udfs
> with a variable number of arguments? Or is it possible to give a
> array-parameter to a udf.
>
> Mysqls set-type is still much more comfortable. Udfs is not a feature the
> average Mysql-user wants to use.
>
>
> Tommi
>
> ---------------------------(end of broadcast)---------------------------
> TIP 4: Don't 'kill -9' the postmaster