The problem here though is that there is no MyTable.  There are two
separate tables, Users and Actions, and I can't alter both of them in
the same statement, as far as I know.  As a result, when I alter just
Users, that fails because there's an FK between Users and Actions and
the type of the two columns is now different.

On Mon, Feb 25, 2008 at 7:50 AM, mos <[EMAIL PROTECTED]> wrote:
> At 05:16 PM 2/24/2008, Waynn Lue wrote:
>  >That's actually why I'm dropping/recreating, because I thought the
>  >changes I have to make require multiple statements.  Let me know if
>  >that's a wrong assumption, here's what I have to do.
>  >
>  >1.  drop two foreign keys from Users to Actions (in the previous
>  >example I gave).
>  >2.  expand INT to BIGINT on Users
>  >3.  expand INT to BIGINT on Actions
>  >4.  recreate two foreign keys from Users to Actions.
>  >
>  >That's four alter statements, which each require making temporary
>  >table copies, so I assumed dropping/recreating was faster.
>
>  Each of your Alter statements will mean a temp table is created, the data
>  is moved over, the changes are made, and the indexes are rebuilt.
>  It will be 4x faster if you do it all in one Alter statement. Since the
>  alter statement will rebuild the keys at the end, is there really a need to
>  to drop the foreign keys or is this an InnoDb quirk?
>
>  Try something like:
>
>  alter table MyTable change column Users Users BigInt, change column Actions
>  Actions BigInt;
>
>  You normally would drop indexes to speed things up when loading a lot of
>  data into the table, then rebuild the indexes after the data has been
>  loaded. But since Alter table does this anyways, you're not accomplishing
>  anything by doing it manually.
>
>  Mike
>
>
>
>
>  >On Sat, Feb 23, 2008 at 2:42 PM, mos <[EMAIL PROTECTED]> wrote:
>  > >
>  > > At 05:55 AM 2/23/2008, Waynn Lue wrote:
>  > >  >I have three or four different ALTER TABLE commands I need to run on a
>  > >  >9 million row table (related to the previous email I sent).  I've
>  > >  >tried running it before and it just takes way too long, so I was
>  > >  >thinking the fastest way to get this done is to create new tables with
>  > >  >the final schema, then drop the old tables and rename the new ones.
>  > >  >
>  > >  >There are a few ways to go about this.
>  > >  >
>  > >  >1. Stop the reads/writes to the db.  Use mysqldump, truncate the
>  > >  >tables, drop the tables, recreate with the correct schema, then import
>  > >  >it again.
>  > >  >2. Create a new temporary table, keep the reads and writes going,
>  > >  >SELECT into that new table, when it catches up, turn off the
>  > >  >reads/writes for a short period of time while I truncate/drop then
>  > >  >rename the temporary table.
>  > >  >3. Use replication somehow to go from the old table to the new table
>  > >  >(can I do that?).
>  > >  >4. Create a new temporary table, stop reads/writes to it, then do an
>  > >  >INSERT INTO SELECT from the old to new table.
>  > >  >
>  > >  >One slight problem with choice 2 is that I don't know how to make sure
>  > >  >that I know when the reads/writes are done.  Not all the tables have
>  > >  >an auto-increment id, so I can't just keep inserting in random ids.
>  > >  >As an aside, if I do INSERT INTO SELECT, does it block any operations
>  > >  >on the table that I'm SELECTing from?
>  > >  >
>  > >  >Thanks for any insights,
>  > >  >Waynn
>  > >
>  > >  Waynn,
>  > >      Why are you using 3 or 4 alter table commands on the same table? 
> Each
>  > >  command means it will create a copy of the table, makes the changes to
>  > >  that, then it renames it to the correct table name and deletes the old
>  > >  table name. You should be able to add all 4 alter table commands in 1
>  > Alter
>  > >  Table statement, just by putting a "," between the alter specifications.
>  > >  See the syntax in the manual:
>  > >  http://dev.mysql.com/doc/refman/5.0/en/alter-table.html This means the
>  > >  table gets rebuilt only once and not 4 times!
>  > >
>  > >  Mike
>  > >
>  > >  --
>  > >  MySQL General Mailing List
>  > >  For list archives: http://lists.mysql.com/mysql
>  > >  To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]
>  > >
>  > >
>
>  --
>
>
> MySQL General Mailing List
>  For list archives: http://lists.mysql.com/mysql
>  To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]
>
>

-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to