On Thursday, October 25, 2012 6:00:22 AM UTC-7, Kartik Rustagi wrote:
>
> Hi,
>
> I have a table A with a column 'abc' which I want to rename to 'xyz'. 
> Column 'abc' being primary key. I have written the following migration to 
> do so:
>
> *alter_table :A do*
> *   rename_column(:abc, :xyz)*
> *end*
> *This migration fails with the error: ERROR 1068 (42000): Multiple 
> primary key defined*
> *Mysql logs shows the query being: ALTER TABLE `A` CHANGE COLUMN `abc` 
> `xyz` int(11) NOT NULL PRIMARY KEY*
>
>
> I reckon this is because we add 'PRIMARY KEY' constraint to alter table 
> statement. How can I avoid this?
>

The rename_column stuff on MySQL probably needs to be modified to not add 
the PRIMARY KEY syntax.  Would be nice if MySQL supported renaming columns 
directly instead of attempting to emulate it with CHANGE COLUMN.  You may 
want to try this untested patch:

diff --git a/lib/sequel/adapters/shared/mysql.rb 
b/lib/sequel/adapters/shared/mysql.rb
index 5515a03..3114cdf 100644
--- a/lib/sequel/adapters/shared/mysql.rb
+++ b/lib/sequel/adapters/shared/mysql.rb
@@ -195,6 +195,7 @@ module Sequel
           opts[:null] = o == :set_column_null ? op[:null] : 
opts[:allow_null]
           opts[:default] = o == :set_column_default ? op[:default] : 
opts[:ruby_default]
           opts.delete(:default) if opts[:default] == nil
+          opts.delete(:primary_key) if op[:op] == :rename_column
           "CHANGE COLUMN #{quote_identifier(op[:name])} 
#{column_definition_sql(op.merge(opts))}"
         when :drop_constraint
           type = case op[:type]

I'll test that later and see how it works.

Jeremy

-- 
You received this message because you are subscribed to the Google Groups 
"sequel-talk" group.
To view this discussion on the web visit 
https://groups.google.com/d/msg/sequel-talk/-/h1WoMkAOvJQJ.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/sequel-talk?hl=en.

Reply via email to