MySQL - 一张表中的多个外键

标签 mysql sql

我正在为游戏制作数据库...问题是我对数据库了解不多。这是我遇到问题的表格:

CREATE TABLE items(
name VARCHAR(30) PRIMARY KEY,
type VARCHAR(20) NOT NULL,
atk INT,
def INT,
arm INT,
price_buy SMALLINT UNSIGNED,
price_sell SMALLINT UNSIGNED);

CREATE TABLE equipment (
id_eq INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
head_s VARCHAR(30),
body_s VARCHAR(30),
right_s VARCHAR(30),
left_s VARCHAR(30),
feet_s VARCHAR(30),
slot1 VARCHAR(30),
slot2 VARCHAR(30),
slot3 VARCHAR(30),
slot4 VARCHAR(30),
slot5 VARCHAR(30),
slot6 VARCHAR(30),
slot7 VARCHAR(30),
slot8 VARCHAR(30),
slot9 VARCHAR(30),
slot10 VARCHAR(30).
FOREIGN KEY (head_s) REFERENCES items(name),
FOREIGN KEY (body_s) REFERENCES items(name),
FOREIGN KEY (right_s) REFERENCES items(name),
FOREIGN KEY (left_s) REFERENCES items(name),
FOREIGN KEY (feet_s) REFERENCES items(name),
FOREIGN KEY (slot1) REFERENCES items(name),
FOREIGN KEY (slot2) REFERENCES items(name),
FOREIGN KEY (slot3) REFERENCES items(name),
FOREIGN KEY (slot4) REFERENCES items(name),
FOREIGN KEY (slot5) REFERENCES items(name),
FOREIGN KEY (slot6) REFERENCES items(name),
FOREIGN KEY (slot7) REFERENCES items(name),
FOREIGN KEY (slot8) REFERENCES items(name),
FOREIGN KEY (slot9) REFERENCES items(name),
FOREIGN KEY (slot10) REFERENCES items(name));

我对这个解决方案有疑问,有人能告诉我这是正确的方法吗?

最佳答案

一般来说,这不是正确的方法,除非您正好有 7 个标记为 1 到 7 的插槽,并且您要将元素放入其中的部分或全部插槽中。

更典型的方式是联结表:

create table EquipmentItems (
    EquipmentItemId int primary key auto_increment,
    EquipmentId int,
    ItemId int,
    constraint fk_equipmentitems_equipment foreign key (EquipementId) references Equipement(id_eq),
    constraint fk_equipmentitems_item foreign key (ItemId) references items(ItemId)
);

如果您仔细查看,您会注意到我向 Items 添加了一个合成 key 。对于外键引用来说这是一个好主意,因为整数通常比字符串更紧凑。

关于MySQL - 一张表中的多个外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39903103/

相关文章:

php - 计算有特价的天数

mysql - 如何将时间戳附加到 curdate() 返回的 mysql 时间?

c++ - 如何在 SQLite 表更新期间刷新 QTableView?

mysql - sql触发器将行插入到两个表中

sql - 将来自同一个表的两个 SELECT 语句与不同的。 where条件

sql - 读取 xsi :type from T-SQL

javascript - 如何使用下拉列表填充文本框

php - 使用php代码创建php文件

MySQL VARCHAR 长度和 UTF-8

mysql - LEFT JOIN 的 SQL 查询不返回结果