0

我需要在表“用户名”上添加一个主键

我有 3 列:

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

并且主键设置在“用户名”字段上,我用它作为外键将其链接到另一个表。现在我还需要在'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

4 回答 4

5

有:

  1. 删除 FK 约束
  2. 删除 PK 约束
  3. 创建新的PK
  4. 在名称列上添加唯一约束
  5. 重新创建 FK

拉吉

于 2013-09-05T10:55:25.687 回答
0

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

您可以决定:

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

或者

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

于 2013-09-05T10:55:34.903 回答
0

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

于 2013-09-05T10:57:22.317 回答
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;
      
于 2013-09-05T11:11:51.010 回答