我正在努力更好地理解关系数据库,但有些东西我一直碰到并且不理解。让我们来看看这两张表:
在这种情况下Login.ID
是主键与auto_increment
集合,Profile.ID_LOGIN
是外键。当创建用户并将其用户名和密码存储在login
数据库中时,是否ID
会自动添加与当前用户名和密码对应的内容,ID_LOGIN
还是我必须创建一个 SQL 语句来执行此操作?
如果我必须创建一个 SQL 语句,我应该如何添加ID_LOGIN
以确保我正确添加它?
我正在努力更好地理解关系数据库,但有些东西我一直碰到并且不理解。让我们来看看这两张表:
在这种情况下Login.ID
是主键与auto_increment
集合,Profile.ID_LOGIN
是外键。当创建用户并将其用户名和密码存储在login
数据库中时,是否ID
会自动添加与当前用户名和密码对应的内容,ID_LOGIN
还是我必须创建一个 SQL 语句来执行此操作?
如果我必须创建一个 SQL 语句,我应该如何添加ID_LOGIN
以确保我正确添加它?
您需要将数据添加到两个表(两个插入语句)。首先,您插入用户并获取其自动生成的 ID。然后您可以使用您在第一次插入中获得的 user_id 插入您的个人资料记录。
也就是说,您描述的是一对多关系(一个用户可能有多个配置文件),但用户和配置文件之间的关系应该是一对一的,因为每个用户总是只有一个配置文件,每个配置文件只对应一个用户。
严格来说,外键只是一个表中的一个字段,它是存储对另一个表中记录的引用的地方。因此,您的代码必须填充两个表并设置外键。
数据库具有外键约束的功能,这有助于禁止在外键值引用的另一个表中没有记录的情况下留下外键的数据库操作。
在 SQL 数据库中维护外键的真正方便之处在于,当您在查询中需要相关数据时,您可以轻松地进行连接以获取相关数据。
顺便说一句,Ruby on Rails 使用关联为您管理外键。因此,如果您使用 Ruby on Rails 进行编程,它会为您设置外键并经常执行您需要的连接。
您应该创建 SQL 语句以将记录添加到 Profile 表中。FK 约束不允许您添加不在登录表中的 ID_LOGIN,因此您不必手动检查它。
当您使用外键将一行插入到 tbale 中时,您必须事先确保您尝试插入外键列的值存在于链接表中。
换句话说:例如,当您尝试在 ID_LOGIN 设置为 25 的 Profile 中插入一行,而在 ID 为 25 的 Login 表中不存在任何行时,您会收到错误消息。
它不会自动添加。您必须使用 create 语句添加它。如果您希望它自动添加,那么您必须使用 Login 表创建触发器。
创建个人资料记录时,您需要确保已链接正确的登录记录。
例如,对于一个叫 John Smith 的人,他收到了 jsmith@thecompany.com 的电子邮件,并且拥有 johns/password 的用户/密码组合
Insert into Profile
values ('John Smith', jsmith@thecompany.com, (select ID from Login where user = jsmith))
将创建一个链接回您的登录记录的配置文件。
您将始终必须创建一个 SQL 查询才能将其添加到 Profile 表中。但也许使用过程/触发器/函数,您可能能够创建一个查询,允许您在登录表中添加一行后立即添加它。