如何编辑表列以接受多个"ID"

  • 本文关键字:ID 何编辑 编辑 mysql sql
  • 更新时间 :
  • 英文 :


短背景:

我正在编辑一个有四个派系的电子游戏。我想让所有派系成为敌人,但只有"弓棒"one_answers"弩"是敌人。以下是定义氏族表中氏族的代码:

INSERT INTO `clan` VALUES ('1', 'Swordman Clan', 'Raffam Oranpere', 'prontera', '500');
INSERT INTO `clan` VALUES ('2', 'Arcwand Clan', 'Devon Aire', 'geffen', '500');
INSERT INTO `clan` VALUES ('3', 'Golden Mace Clan', 'Berman Aire', 'prontera', '500');
INSERT INTO `clan` VALUES ('4', 'Crossbow Clan', 'Shaam Rumi', 'payon', '500');
CREATE TABLE IF NOT EXISTS `clan_alliance` (
`clan_id` int(11) unsigned NOT NULL DEFAULT '0',
`opposition` int(11) unsigned NOT NULL DEFAULT '0',
`alliance_id` int(11) unsigned NOT NULL DEFAULT '0',
`name` varchar(24) NOT NULL DEFAULT '',
PRIMARY KEY (`clan_id`,`alliance_id`),
KEY `alliance_id` (`alliance_id`)
) ENGINE=MyISAM;
-- ----------------------------
-- Records of clan_alliance
-- ----------------------------

以下是确定谁与谁结盟以及谁与谁为敌的代码。

INSERT INTO `clan_alliance` VALUES ('1', '0', '3', 'Golden Mace Clan');
INSERT INTO `clan_alliance` VALUES ('2', '0', '3', 'Golden Mace Clan');
INSERT INTO `clan_alliance` VALUES ('2', '1', '4', 'Crossbow Clan');
INSERT INTO `clan_alliance` VALUES ('3', '0', '1', 'Swordman Clan');
INSERT INTO `clan_alliance` VALUES ('3', '0', '2', 'Arcwand Clan');
INSERT INTO `clan_alliance` VALUES ('3', '0', '4', 'Crossbow Clan');
INSERT INTO `clan_alliance` VALUES ('4', '0', '3', 'Golden Mace Clan');
INSERT INTO `clan_alliance` VALUES ('4', '1', '2', 'Arcwand Clan')

我在我的工作台中运行它,并在SQL表中获取它。默认情况下,这是有效的,但我试图编辑它,让每个部落都成为其他部落的敌人。有没有一种方法可以让我把多个id值放在部落联盟表中的反对派字段中?

首先规范化您的模式。

你应该有一个联盟和反对党的链接表。

DROP TABLE clan_alliance;
CREATE TABLE clan_alliance
(clan1 integer(11) unsigned,
clan2 integer(11) unsigned,
PRIMARY KEY (clan1,
clan2),
FOREIGN KEY (clan1)
REFERENCES clan
(id),
FOREIGN KEY (clan2)
REFERENCES clan
(id),
CHECK (clan1 < clan2));

CREATE TABLE clan_opposition
(clan1 integer(11) unsigned,
clan2 integer(11) unsigned,
PRIMARY KEY (clan1,
clan2),
FOREIGN KEY (clan1)
REFERENCES clan
(id),
FOREIGN KEY (clan2)
REFERENCES clan
(id),
CHECK (clan1 < clan2));

这假设clan的主键是一个称为integer(11) unsigned类型的id的单列。如果假设错误,则可能需要更改外键类型和约束。

在旧版本的MySQL(尤其是小于8的MySQL(中,检查约束不起作用(创建表时会对其进行解析,但插入数据时不会强制执行(。因此,您可能需要创建触发器来替换它们。

请注意,这些表中不能有部落名称的列。这样的列是多余的,因为clan中已经有了这些名称。

为了让所有部落相互对立,你可以在第一个ID小于第二个ID的情况下使用INSERT ... SELECT ...自加入clan

INSERT INTO clan_opposition
(clan1,
clan2)
SELECT c1.id,
c2.id
FROM clan c1
INNER JOIN clan c2
ON c1.id < c2.id;

您还应该养成一种习惯,总是用INSERT显式地注释目标列。否则事情可能会变得一团糟。

最新更新