use*_*230 10 mysql composite-primary-key
我最近遇到了MySQL本身和MySQL中的复合主键的主题,特别是它如何有用以及它从这个站点的优点和缺点是什么
我想玩这个,所以我以这种方式创建了三个表:
CREATE TABLE person(
personId INT(11) NOT NULL,
personName VARCHAR(20) NOT NULL,
PRIMARY KEY(personId)
)
CREATE TABLE language(
languageId INT(11) NOT NULL,
languageName VARCHAR(20) NOT NULL,
PRIMARY KEY(personId)
)
CREATE TABLE personLanguage(
personId INT(11) NOT NULL,
languageId INT(11) NOT NULL,
description VARCHAR(20) NOT NULL,
PRIMARY KEY(personId, languageId),
FOREIGN KEY (personId) REFERENCES person(personId) ON UPDATE CASCADE ON DELETE CASCADE,
FOREIGN KEY (languageId) REFERENCES language(languageId) ON UPDATE CASCADE ON DELETE CASCADE
)
Run Code Online (Sandbox Code Playgroud)
我可以直接向人员和语言表中插入数据,我的问题是:
对于personLanguage表,我需要只插入描述列,而其他列是自动引用的,还是我需要在personLanguage表中插入其他两列的值
一旦插入其他两个表中的数据,是否有可能在personLanguage表中自动更新personId和languageId,据我所知,当在某个人或语言表中进行某些更新/删除时,它会反映相同的情况.在personLanguage表中的两列
如何获取与三个表相关的数据,例如我需要知道personId = 1的人说的是哪种语言?它是使用连接的直接查询还是有其他方法可以做,因为我使用复合主键
很多问题困扰着我,我无法找到一个完整的工作示例来检查使用复合主键的确切优缺点.如果有人可以使用我的例子详细说明这一点,那将非常有帮助.
我知道我有点问过一些基本的,有些什么是没有意义的问题,但请相信我并对这个话题有所了解
对于 personLanguage 表,我是否需要仅插入描述列,而自动引用其他列,或者我是否需要在 personLanguage 表中插入其他两列的值
是的,您需要插入所有三列才能完全有效。否则数据库将不知道您试图将此记录与什么人或语言联系起来。
插入其他两个表中的数据后,是否有可能自动更新 personLanguage 表中的 personId 和 languageId,据我所知,当在 person 或 language 表中完成某些更新/删除时,它会反映相同的情况personLanguage 表中的两列
您可以通过插入触发器来执行此操作,但这可能没有任何意义。假设您刚刚输入了一种新语言 - 比如说法语。您根本不需要在 personLanguage 表中输入任何值,因为您现有的用户可能不希望获取法语信息。同样的情况也适用于创建一个新人。你可能有很多种语言。大多数人不会说大多数语言,因此,您不会希望自动将记录输入到 personLanguage 表中。
至于更新人员和语言记录,KEYS 不应改变。这就是为什么你会做这样的事情。一旦鲍勃或爱丽丝被分配了一个 personId,他们就是那个 Id。一旦为法语分配了 langaugeId,它就应该始终是该 languageId。
如何获取三个表的相关数据,例如我需要知道personId=1的人讲哪种语言?它也是使用联接的直接查询还是有其他方法可以做,因为我使用复合主键
嗯,这是一个棘手的问题。如果您试图获取 personId=1 所说的所有语言,那么加入非常简单。
select pl.personId, l.languageId, l.languageName
from personLanguage pl
join language l on l.languageId = pl.languageId
where pl.personId = 1
Run Code Online (Sandbox Code Playgroud)
如果您试图确定应该与该人交流哪种语言,事情会变得更加复杂,因为该人可能没有定义任何 personLanguages。如果您可以接受空值,则可以使用外连接,但您需要定义查询以便仅返回单一语言。