我需要在表“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
有没有办法做到这一点??
答案 0 :(得分:5)
有:
拉吉
答案 1 :(得分:0)
我假设您使用MySql(尽管您将问题标记为Sql Server)。
您可以决定:
禁用所有检查并尝试删除主键,但新键必须具有相同的名称
或
删除引用主键的外键约束,然后删除主键,最后重新添加外键
答案 2 :(得分:0)
您必须删除外键才能修改主键
答案 3 :(得分:0)
正如名称所暗示的那样,一张表最多只能有一个一个 PRIMARY
键。虽然它可以有其他具有类似效果的UNIQUE
键,但它们实际上不应该用于外键关系。
所以,你有两个选择:
保留现有架构(也许username
是一个非常好的自然键,因此您无需为合成架构烦恼,在这种情况下,您可以考虑完全删除userid
列。 ;或
将userid
设为PRIMARY
密钥,在这种情况下,username
不应用于外键关系。我在下面概述了这种“离线”的方法(保证数据库在转换期间不被任何其他进程改变);如果您在线工作,则需要添加更多步骤以确保完整性:
在所有子表中为外键添加新的userid
列,并删除现有的外键约束:
ALTER TABLE foo
ADD COLUMN userid INT(10),
DROP FOREIGN KEY fk_name;
更改usernames
表中的主键(如果您希望数据库强制执行username
的唯一性约束,则可以改为定义UNIQUE
键:
ALTER TABLE usernames
DROP PRIMARY KEY,
ADD PRIMARY KEY (userid),
ADD UNIQUE KEY (username); -- optional
更新子表以包含父级的相关userid
:
UPDATE foo JOIN usernames USING (username)
SET foo.userid = usernames.userid;
添加新的外键约束并从子表中删除旧的username
列:
ALTER TABLE foo
ADD FOREIGN KEY (userid) REFERENCES usernames (userid),
DROP COLUMN username;