Обсуждение: Copying data from one table to another - how to specify fields?

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

Copying data from one table to another - how to specify fields?

От
Alexander Farber
Дата:
Hello,

I'm using CentOS 5.5 with PostgreSQL 8.4.7 and
am migrating my site from phpBB 3 to Drupal 7.

I would like to copy these fields from one table:

  select user_id, username, user_email, user_regdate, user_lastvisit
from phpbb_users where user_id > 50;

into the other (already existing) table:

  select uid, name, mail, created, access from drupal_users;

I've read http://www.postgresql.org/docs/8.4/static/sql-selectinto.html
and few more docs but don't understand, how could I specify the
fields correspondence (i.e. phpbb_users.user_id -> drupal_users.uid)

Also the target table exists already, has some records already
and has more fields than specified in my select statement above.

Thank you
Alex

Re: Copying data from one table to another - how to specify fields?

От
Andrew Sullivan
Дата:
On Wed, Mar 09, 2011 at 02:47:46PM +0100, Alexander Farber wrote:
> I would like to copy these fields from one table:
>
>   select user_id, username, user_email, user_regdate, user_lastvisit
> from phpbb_users where user_id > 50;
>
> into the other (already existing) table:
>
>   select uid, name, mail, created, access from drupal_users;
>

INSERT INTO drupal users (uid, name, mail, created, access)
       SELECT user_id, username, user_email, user_regdate, user_lastvist
         FROM phpbb_users where user_id > 50;

This is sort of like an example on
http://www.postgresql.org/docs/9.0/interactive/sql-insert.html, but
that example uses SELCT *.  Perhaps an additional example would have
helped?  (This is basic SQL, though, and I'm not sure the keyword
manual is the best place for such an example.)

A

--
Andrew Sullivan
ajs@crankycanuck.ca

Re: Copying data from one table to another - how to specify fields?

От
Michael Glaesemann
Дата:
On Mar 9, 2011, at 08:47 , Alexander Farber wrote:

> Hello,
>
> I'm using CentOS 5.5 with PostgreSQL 8.4.7 and
> am migrating my site from phpBB 3 to Drupal 7.
>
> I would like to copy these fields from one table:
>
>  select user_id, username, user_email, user_regdate, user_lastvisit
> from phpbb_users where user_id > 50;
>
> into the other (already existing) table:
>
>  select uid, name, mail, created, access from drupal_users;

INSERT INTO drupal_users (uid, name, mail, created, access)
  SELECT user_id, username, user_email, user_regdate, user_lastvisit
    FROM phpbb_users
    WHERE user_id > 50;

<http://www.postgresql.org/docs/9.0/interactive/sql-insert.html>

Michael Glaesemann
michael.glaesemann@myyearbook.com




Re: Copying data from one table to another - how to specify fields?

От
Alexander Farber
Дата:
Oh it is called "INSERT INTO", thank you!

I still have a problem though:

# select uid, name, mail, created, access from drupal_users;
 uid | name |            mail            |  created   |   access
-----+------+----------------------------+------------+------------
   0 |      |                            |          0 |          0
   1 | Alex | Alexander.Farber@gmail.com | 1299512207 | 1299751991
(2 rows)

# INSERT INTO drupal_users (uid, name, mail, created, access)
 SELECT user_id, username, user_email, user_regdate, user_lastvisit
   FROM phpbb_users
   WHERE user_id > 50 and length(username) > 0;
ERROR:  duplicate key value violates unique constraint "drupal_users_name_key"

I don't understand, what is wrong with "name" here and
how to find the troublemaking record in my 4700 lines table

# \d+ drupal_users_name_key;
          Index "public.drupal_users_name_key"
 Column |         Type          | Storage  | Description
--------+-----------------------+----------+-------------
 name   | character varying(60) | extended |
unique, btree, for table "public.drupal_users"

Using PostgreSQL 8.4.7

Thank you
Alex

Re: Copying data from one table to another - how to specify fields?

От
Raymond O'Donnell
Дата:
On 09/03/2011 14:21, Alexander Farber wrote:
> Oh it is called "INSERT INTO", thank you!
>
> I still have a problem though:
>
> # select uid, name, mail, created, access from drupal_users;
>   uid | name |            mail            |  created   |   access
> -----+------+----------------------------+------------+------------
>     0 |      |                            |          0 |          0
>     1 | Alex | Alexander.Farber@gmail.com | 1299512207 | 1299751991
> (2 rows)
>
> # INSERT INTO drupal_users (uid, name, mail, created, access)
>   SELECT user_id, username, user_email, user_regdate, user_lastvisit
>     FROM phpbb_users
>     WHERE user_id>  50 and length(username)>  0;
> ERROR:  duplicate key value violates unique constraint "drupal_users_name_key"
>
> I don't understand, what is wrong with "name" here and
> how to find the troublemaking record in my 4700 lines table

Is "drupal_users" a table you created yourself? In a vanilla
installation of Drupal, the users table is called just "users".

Anyway, to answer your question, you're trying to insert into
drupal_users a value that already exists there, and which is subject to
a constraint which allows only one instance of that value. To find the
offending value you could do something like this (not tested):

   select * from phpbb_users where exists
   (select 1 from drupal_users
     where drupal_users.name = phpbb_users.name);


Hope this helps,

Ray.

--
Raymond O'Donnell :: Galway :: Ireland
rod@iol.ie

Re: Copying data from one table to another - how to specify fields?

От
Alexander Farber
Дата:
Hello Raymond and others,

thank you for looking at my problem!

It is a core Drupal 7 table, with a prefix "drupal_"
(you can set it while installing Drupal 7 in adv. options).

I have only 2 records in that target table:

# select uid, name, mail, created, access from drupal_users;
 uid | name |            mail            |  created   |   access
-----+------+----------------------------+------------+------------
   0 |      |                            |          0 |          0
   1 | Alex | Alexander.Farber@gmail.com | 1299512207 | 1299753672
(2 rows)

I've tried you suggestion and the conflicting record is 'Alex':

#  select username, user_id from phpbb_users where exists
 (select 1 from drupal_users
   where drupal_users.name = phpbb_users.username);
 username | user_id
----------+---------
 Alex     |       2
(1 row)

But isn't that record excluded by the conditions below?

# INSERT INTO drupal_users (uid, name, mail, created, access)
 SELECT user_id, username, user_email, user_regdate, user_lastvisit
   FROM phpbb_users
   WHERE user_id > 50 and length(username) > 0 and username <> 'Alex';
ERROR:  duplicate key value violates unique constraint "drupal_users_name_key"

Re: Copying data from one table to another - how to specify fields?

От
Alexander Farber
Дата:
I've also tried renaming 'Alex' to a temp. value:

# update drupal_users set name='Alex_1972' where name='Alex';
UPDATE 1

# INSERT INTO drupal_users (uid, name, mail, created, access)
 SELECT user_id, username, user_email, user_regdate, user_lastvisit
   FROM phpbb_users
   WHERE user_id > 50 and length(username) > 0 and username <> 'Alex';
ERROR:  duplicate key value violates unique constraint "drupal_users_name_key"

# select username, user_id from phpbb_users where exists
 (select 1 from drupal_users
   where drupal_users.name = phpbb_users.username);
 username | user_id
----------+---------
(0 rows)

so there must be a duplicated username in the source table
phpbb_users, but how could I find that record?

Thank you
Alex

Re: Copying data from one table to another - how to specify fields?

От
Alexander Farber
Дата:
Oh ok, found it:

# select one.username, one.user_id, two.user_id from phpbb_users one,
phpbb_users two where two.username=one.username and two.user_id <>
one.user_id;
 username | user_id | user_id
----------+---------+---------
 Вячеслав |    7564 |     421
 Вячеслав |     421 |    7564
(2 rows)

Sorry!

Re: Copying data from one table to another - how to specify fields?

От
"David Johnston"
Дата:
2 Possibilities (assuming there is a single record with name == 'Alex' in
the drupal_users table; not counting uid 0)

1. There is a record with username = 'Alex' in the phpbb_users table
2. Username is not UNIQUE within phpbb_users

Write a select statement to extract username from phpbb_user for BOTH these
conditions.

Decide how you want to modify those records so that can be imported into
drupal_users.

David J.

-----Original Message-----
From: pgsql-general-owner@postgresql.org
[mailto:pgsql-general-owner@postgresql.org] On Behalf Of Alexander Farber
Sent: Wednesday, March 09, 2011 9:21 AM
To: pgsql-general@postgresql.org
Subject: Re: [GENERAL] Copying data from one table to another - how to
specify fields?

Oh it is called "INSERT INTO", thank you!

I still have a problem though:

# select uid, name, mail, created, access from drupal_users;
 uid | name |            mail            |  created   |   access
-----+------+----------------------------+------------+------------
   0 |      |                            |          0 |          0
   1 | Alex | Alexander.Farber@gmail.com | 1299512207 | 1299751991
(2 rows)

# INSERT INTO drupal_users (uid, name, mail, created, access)  SELECT
user_id, username, user_email, user_regdate, user_lastvisit
   FROM phpbb_users
   WHERE user_id > 50 and length(username) > 0;
ERROR:  duplicate key value violates unique constraint
"drupal_users_name_key"

I don't understand, what is wrong with "name" here and how to find the
troublemaking record in my 4700 lines table



Re: Copying data from one table to another - how to specify fields?

От
"David Johnston"
Дата:
SELECT username, count(username) FROM phpbb_users
GROUP BY username
HAVING count(username) > 1;

If anything shows up then (phpbb_users .username) is not a unique field but
you are trying to insert it into one that is (drupal_users.uid)



-----Original Message-----
From: pgsql-general-owner@postgresql.org
[mailto:pgsql-general-owner@postgresql.org] On Behalf Of Alexander Farber
Sent: Wednesday, March 09, 2011 9:48 AM
To: pgsql-general@postgresql.org
Subject: Re: [GENERAL] Copying data from one table to another - how to
specify fields?

Hello Raymond and others,

thank you for looking at my problem!

It is a core Drupal 7 table, with a prefix "drupal_"
(you can set it while installing Drupal 7 in adv. options).

I have only 2 records in that target table:

# select uid, name, mail, created, access from drupal_users;
 uid | name |            mail            |  created   |   access
-----+------+----------------------------+------------+------------
   0 |      |                            |          0 |          0
   1 | Alex | Alexander.Farber@gmail.com | 1299512207 | 1299753672
(2 rows)

I've tried you suggestion and the conflicting record is 'Alex':

#  select username, user_id from phpbb_users where exists  (select 1 from
drupal_users
   where drupal_users.name = phpbb_users.username);  username | user_id
----------+---------
 Alex     |       2
(1 row)

But isn't that record excluded by the conditions below?

# INSERT INTO drupal_users (uid, name, mail, created, access)  SELECT
user_id, username, user_email, user_regdate, user_lastvisit
   FROM phpbb_users
   WHERE user_id > 50 and length(username) > 0 and username <> 'Alex';
ERROR:  duplicate key value violates unique constraint
"drupal_users_name_key"

--
Sent via pgsql-general mailing list (pgsql-general@postgresql.org) To make
changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general


Re: Copying data from one table to another - how to specify fields?

От
Alexander Farber
Дата:
Thank you all for the replies!

On Wed, Mar 9, 2011 at 7:01 PM, David Johnston <polobo@yahoo.com> wrote:
> SELECT username, count(username) FROM phpbb_users
> GROUP BY username
> HAVING count(username) > 1;
>
> If anything shows up then (phpbb_users .username) is not a unique field but
> you are trying to insert it into one that is (drupal_users.uid)
>