一对多与一个表格

24 浏览
0 Comments

一对多与一个表格

我正在尝试使用一张表创建一对多的关系。\n这是可能的吗?\n

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);

\n现在,当我删除id=1的用户时,created_by的值会自动更改为NULL,这是我期望的。\n但是,当我更改id=1的用户的id时,我会收到以下错误\n

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)

\n我该如何解决这个问题?在此更新后,我希望created_by列也能进行级联更改。

0
0 Comments

文章标题:一对多关系中的一个表的问题及解决方法

在数据库设计中,主键是用于唯一标识一个实体的,而不是用于改变的。因此,具有id 2的用户在逻辑上是与具有id 1的用户不同的用户。一旦创建了一个唯一的用户,其主键在该用户的生命周期内应该保持不变。

所以,这实际上是一个设计问题。你需要考虑为什么要改变特定用户的id。可能是你既想要一个固定的唯一标识键,又想要另一个标识符(不是键,仅存在于用户表中)可以改变。

在关系数据库设计的基础上,有很多资源可以参考。例如,《关系数据库设计基础》一书中的相关章节“表、唯一性和键”。

Fabian Pascal在他的书《SQL和关系基础》中指出,决策应该基于最小化(选择所需的最少列)、稳定性(选择很少更改的键)和简单性/熟悉性(选择简单且对用户来说熟悉的键)的原则。

个人而言,我会更加注重稳定性;尽量选择一个永远不会改变的键。例如,对于用户来说,“电子邮件”作为一个键是一个不好的选择,因为用户可以更改他们的电子邮件。如果你选择一个键,比如一个内部生成的编号或者可能是人员系统中的唯一标识符,那么你就不必担心它的改变并将此更改迁移到其他表中。

需要注意的是,也许有一些情况下,你需要“一次性”更改一个主键。这最好通过一些手动的SQL语句来完成(删除第一个用户并创建一个具有不同键的相同的第二个用户)。然而,这不应该成为数据库设计的一部分,因为级联更新的自动化特性暗示了它。

在上面的例子中,假设我们使用电子邮件地址而不是id。用户想要更改他的电子邮件,而电子邮件是表中的主键。

是的,这是一个糟糕的数据库设计,所以没有自动级联更改的方法,因为你不应该这样做。我会更新我的回答,提供一个外部资源来进行解释。

🙂 将电子邮件地址作为主键是一个错误的实现概念-错误的数据库设计。

嘿,我知道这是错误的数据库设计...但是我想要为了教育目的而实现这个。

🙂 为了教育目的而实现错误的数据库设计是没有意义的。你真的想要走错误的道路吗?

我理解你的观点 🙂 但我想知道是否可能在一个表之间建立这种关系。我知道这是不好的,但我需要知道是否可能。

我只是在试验外键以更好地理解它们。我不会使用这个数据库。

好的,那么我的最后一个问题...如果我更新父id,是否可能告诉mysql更新外键?我们正在讨论上面的例子。

查看:stackoverflow.com/questions/1481476/...

我已经看过了...这是一个完全不同的概念-我们有一个表和一个指向相同表的外键。

我觉得我们偏离了你最初提出的问题。你应该澄清你的原始问题。

我的问题是“这可能吗?”。

让我们在聊天中继续这个讨论。

0