我有一张表格,其中保存了玩家角色信息。我有另一张表,其中保留了所有可能的状态影响。我试图找出如何创建一个关系,其中第一个表中的任何/所有/没有字符条目可以链接到第二个表中的任何/所有/没有状态条目。我的研究告诉我,我可能需要第三个表,可能需要使用复合主键和/或代理键?
所以这是基于回复的更新。我似乎已经完成了我希望实现的目标。这是代码:
create table characters (
char_id int primary key auto_increment,
name varchar(25)
);
create table health_status (
status_id int primary key auto_increment,
stat_name varchar(15)
);
create table char_status (
char_id int,
status_id int,
primary key (char_id, status_id)
);
insert into characters (name) values ('Godzilla');
insert into characters (name) values ('King Kong');
insert into characters (name) values ('Mecha-Dragon');
insert into characters (name) values ('Chris Hanson');
insert into characters (name) values ('Journey');
insert into characters (name) values ('Lou Diamond Phillips');
insert into characters (name) values ('RedHot');
insert into health_status (stat_name) values ('Bleeding');
insert into health_status (stat_name) values ('Shaken');
insert into health_status (stat_name) values ('Frightened');
insert into health_status (stat_name) values ('Petrified');
insert into health_status (stat_name) values ('Poisoned');
insert into health_status (stat_name) values ('Slowed');
insert into health_status (stat_name) values ('Rushed');
insert into health_status (stat_name) values ('Endowed');
insert into char_status (char_id, status_id) values (1, 1);
insert into char_status (char_id, status_id) values (1, 3);
insert into char_status (char_id, status_id) values (1, 6);
insert into char_status (char_id, status_id) values (2, 2);
insert into char_status (char_id, status_id) values (2, 4);
insert into char_status (char_id, status_id) values (3, 7);
insert into char_status (char_id, status_id) values (6, 8);
insert into char_status (char_id, status_id) values (7, 2);
insert into char_status (char_id, status_id) values (7, 7);
select characters.name, health_status.stat_name
from characters
left join char_status on characters.char_id = char_status.char_id
left join health_status ON health_status.status_id =
char_status.status_id;
我有三个问题。有没有人看到任何方式可以清理,或更好的方式来实现我的目标?另外,表char_status中的复合PK真的有用吗?最后,有没有办法用查询来组织输出,只列出一次字符名称,然后列出所有相关的状态 - 或者这是否适合不同的语言?谢谢大家的帮助!
答案 0 :(得分:1)
根据您的结构,您说您需要进一步创建新表并将数据放入其中。**
为了让你在tableA和TableB之间进行连接,你需要拥有 一个中的主键,以及其他
中的引用
**。多对多的关系就像一个共同的关系,其中tableA依赖于tableB的许多元素,反之亦然。
您可能需要先根据自己的情况对表格进行标准化。
答案 1 :(得分:1)
正如您在研究中发现的那样
创建一个包含2个字段的第三个表格,这两个字段将保存那两个表格中的“id”(主要字段),这两个表格要与多个很多很多...
CREATE TABLE `many_to_many` ( `information_id` INT(11) NOT NULL , `status_id` INT(11) NOT NULL , PRIMARY KEY (`information_id`, `status_id`)) ENGINE = MyISAM;
支持依赖于2个字段的PRIMARY KEY。
现在您可以为每个information_id添加许多status_id关系,
和status_id有很多information_id关系。
首次尝试时,运行此查询以添加值以查看
INSERT INTO `many_to_many` (`information_id`, `status_id`) VALUES (1, 1), (1, 2), (2, 1), (2, 2);