有一张桌子的一对多

mec*_*cio 5 mysql

我试图使用一个表创建一对多的关系.这可能吗?

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是级联更改.

Tim*_*Gee 2

密钥并不意味着可以更改,而是用于“识别”。因此,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