我试图使用一个表创建一对多的关系.这可能吗?
create table user(id int primary key auto_increment not null,
created_by int default null
)ENGINE=INNODB;
alter table user add foreign key (created_by) references user(id) ON DELETE SET NULL ON UPDATE CASCADE;
insert into user (id) VALUES(1);
insert into user (id, created_by) VALUES (2,1);
Run Code Online (Sandbox Code Playgroud)
现在,当我删除id = 1的用户时,created_by的值会自动变为NULL.
但是当我更改id = 1的用户的id时,我收到此错误
mysql> update user set id=2 where id=1;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`jrt`.`user`, CONSTRAINT `user_ibfk_1` FOREIGN KEY (`created_by`) REFERENCES `user` (`id`) ON DELETE SET NULL ON UPDATE CASCADE)
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?更新此更新我希望列created_by是级联更改.
密钥并不意味着可以更改,而是用于“识别”。因此,id 为 2 的用户在逻辑上与 id 为 1 的用户是不同的用户。在创建唯一用户时,它的主键在该用户的生命周期内应该是相同的。
所以这确实是一个设计问题。您需要询问为什么要更改特定用户的 ID。您可能想要的是一个固定的标识键和另一个可以更改的标识符(不是键,仅存在于用户表中)。
[更新了更多信息] 这是有关关系数据库设计基础知识的资源(网上有很多资源)。http://www.deeptraining.com/litwin/dbdesign/FundamentalsOfRelationalDatabaseDesign.aspx
相关部分是“表、唯一性和键”。
Fabian Pascal 在他的《SQL 和关系基础》一书中指出,该决策应基于最小化原则(选择所需的最少列)、稳定性(选择很少更改的键)和简单性/熟悉性(选择一个不改变的键)。对用户来说既简单又熟悉)。
就我个人而言,我会在稳定性方面走得更远;尝试选择一个永不改变的密钥。例如,“电子邮件”对于用户来说是一个错误的密钥选择,因为用户可以更改他们的电子邮件。如果您选择一个键,例如内部生成的数字或人事系统中的唯一标识符,那么您不必担心它会发生更改并将此更改迁移到其他表。
注意:在某些情况下,您可能需要“一次性”更改主键。最好通过一些手动 SQL 语句来完成此操作(删除第一个用户并使用不同的密钥创建相同的第二个用户)。但它不应该成为数据库设计的一部分,这是级联更新的自动化性质所暗示的。
另请参见: 何时使用“ON UPDATE CASCADE”
另请注意: http://forums.mysql.com/read.php? 136,391782,391782
| 归档时间: |
|
| 查看次数: |
436 次 |
| 最近记录: |