外键已存在时添加主键

时间:2013-09-05 10:50:40

标签: mysql sql sqlite mysql-workbench

我需要在表“usernames”

上添加主键

我有3列:

userid int(10)
username char(20)
user char(50)

并且主键在'username'字段上设置,我将其用作外键以将其链接到另一个表。现在我需要在'userid'字段上添加主键...所以我尝试了:

alter table `usernames` drop primary key, add primary key(userid,username);

我收到错误

ERROR 1553 (HY000): Cannot drop index 'PRIMARY":needed in a foreign key constraint 

有没有办法做到这一点??

4 个答案:

答案 0 :(得分:5)

有:

  1. 删除FK约束
  2. Drop PK Constraint
  3. 创建新PK
  4. 在名称列
  5. 上添加唯一约束
  6. 重新创建FK
  7. 拉​​吉

答案 1 :(得分:0)

我假设您使用MySql(尽管您将问题标记为Sql Server)。

您可以决定:

禁用所有检查并尝试删除主键,但新键必须具有相同的名称

删除引用主键的外键约束,然后删除主键,最后重新添加外键

答案 2 :(得分:0)

您必须删除外键才能修改主键

答案 3 :(得分:0)

正如名称所暗示的那样,一张表最多只能有一个一个 PRIMARY键。虽然它可以有其他具有类似效果的UNIQUE键,但它们实际上不应该用于外键关系。

所以,你有两个选择:

  • 保留现有架构(也许username是一个非常好的自然键,因此您无需为合成架构烦恼,在这种情况下,您可以考虑完全删除userid列。 ;或

  • userid设为PRIMARY密钥,在这种情况下,username不应用于外键关系。我在下面概述了这种“离线”的方法(保证数据库在转换期间不被任何其他进程改变);如果您在线工作,则需要添加更多步骤以确保完整性:

    1. 在所有子表中为外键添加新的userid列,并删除现有的外键约束:

      ALTER TABLE foo
        ADD COLUMN userid INT(10),
        DROP FOREIGN KEY fk_name;
      
    2. 更改usernames表中的主键(如果您希望数据库强制执行username的唯一性约束,则可以改为定义UNIQUE键:

      ALTER TABLE usernames
        DROP PRIMARY KEY,
        ADD  PRIMARY KEY (userid),
        ADD  UNIQUE  KEY (username);  -- optional
      
    3. 更新子表以包含父级的相关userid

      UPDATE foo JOIN usernames USING (username)
        SET foo.userid = usernames.userid;
      
    4. 添加新的外键约束并从子表中删除旧的username列:

      ALTER TABLE foo
        ADD FOREIGN KEY (userid) REFERENCES usernames (userid),
        DROP COLUMN username;