Remove Primary Key in MySQL

464,466

Solution 1

Without an index, maintaining an autoincrement column becomes too expensive, that's why MySQL requires an autoincrement column to be a leftmost part of an index.

You should remove the autoincrement property before dropping the key:

ALTER TABLE user_customer_permission MODIFY id INT NOT NULL;
ALTER TABLE user_customer_permission DROP PRIMARY KEY;

Note that you have a composite PRIMARY KEY which covers all three columns and id is not guaranteed to be unique.

If it happens to be unique, you can make it to be a PRIMARY KEY and AUTO_INCREMENT again:

ALTER TABLE user_customer_permission MODIFY id INT NOT NULL PRIMARY KEY AUTO_INCREMENT;

Solution 2

One Line:

ALTER TABLE  `user_customer_permission` DROP PRIMARY KEY , ADD PRIMARY KEY (  `id` )

You will also not lose the auto-increment and have to re-add it which could have side-effects.

Solution 3

I believe @Quassnoi has answered your direct question.

Just a side note, maybe this is just some awkward wording on your part, but you seem to be under the impression that you have three primary keys, one on each field.

This is not the case. By definition, you can only have one primary key. What you have here is a primary key that is a composite of three fields.

Thus, you cannot "drop the primary key on a column", you can drop the primary key, or not drop the primary key.

If you want a primary key that only includes one column, you can drop the existing primary key on 3 columns and create a new primary key on 1 column.

Solution 4

ALTER TABLE `user_customer_permission` MODIFY `id` INT;
ALTER TABLE `user_customer_permission` DROP PRIMARY KEY;

Solution 5

In case you have composite primary key, do like this- ALTER TABLE table_name DROP PRIMARY KEY,ADD PRIMARY KEY (col_name1, col_name2);

Share:
464,466

Related videos on Youtube

markb
Author by

markb

SOreadytohelp

Updated on July 08, 2022

Comments

  • markb
    markb almost 2 years

    I have the following table schema which maps user_customers to permissions on a live MySQL database:

    mysql> describe user_customer_permission;
    +------------------+---------+------+-----+---------+----------------+
    | Field            | Type    | Null | Key | Default | Extra          |
    +------------------+---------+------+-----+---------+----------------+
    | id               | int(11) | NO   | PRI | NULL    | auto_increment |
    | user_customer_id | int(11) | NO   | PRI | NULL    |                |
    | permission_id    | int(11) | NO   | PRI | NULL    |                |
    +------------------+---------+------+-----+---------+----------------+
    3 rows in set (0.00 sec)
    

    I would like to remove the primary keys for user_customer_id and permission_id and retain the primary key for id.

    When I run the command:

    alter table user_customer_permission drop primary key;
    

    I get the following error:

    ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
    

    How can I drop a column's primary key?

  • markb
    markb over 14 years
    Wouldn't I then have to restore the id column as auto_increment primary key? alter table user_customer_permission add primary key (id); alter table user_customer_permission change id id int(11) auto_increment;
  • Quassnoi
    Quassnoi over 14 years
    @markb: if you restore the primary key, you sure may revert it back to AUTO_INCREMENT.
  • tomfumb
    tomfumb about 13 years
    I think this answer needs to float to the top as not only does it remove the need to change the field definition, it also allows the change through with fk constraints on the table being altered - really helped me out!
  • Arup Rakshit
    Arup Rakshit over 10 years
    what does this mean autoincrement column to be a leftmost part of the PRIMARY KEY. ?
  • Quassnoi
    Quassnoi over 10 years
    @ArupRakshit: dev.mysql.com/doc/refman/5.6/en/… To use the AUTO_INCREMENT mechanism with an InnoDB table, an AUTO_INCREMENT column ai_col must be defined as part of an index such that it is possible to perform the equivalent of an indexed SELECT MAX(ai_col) lookup on the table to obtain the maximum column value. Typically, this is achieved by making the column the first column of some table index.
  • Bengi Besçeli
    Bengi Besçeli over 6 years
    it says PRIMARY is not defined. Why this occurs? So I had to delete and add again the ID column without specifying primary key
  • Quassnoi
    Quassnoi over 6 years
    @hqtunes Don't have a slightest idea. Would probably help to give a tad more detail
  • Pirate X
    Pirate X about 6 years
    While this post may solve the question, including a screenshot really helps to improve the quality of your post. Remember that you are answering the question for readers in the future, and those people might not know the same UI you're looking at.
  • user2447161
    user2447161 over 4 years
    Perfect ! For me dropping the primary key did not work, even if I alter the field to get rid of the auto increment. But this solution works fine !