Как отредактировать столбец таблицы, чтобы принимать несколько идентификаторов - PullRequest
1 голос
/ 02 мая 2020

Краткая справка:

Я редактирую видеоигру, в которой есть четыре фракции. Я хочу сделать всех фракций врагами, но только «арочные палочки» и «арбалеты» являются врагами. Вот код, определяющий кланы в таблице кланов:

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 таблице. Это работает по умолчанию, но я пытаюсь изменить это и сделать каждый клан врагом любого другого клана. Есть ли способ, которым я могу поместить несколько значений идентификатора в поле оппозиции в таблице альянса клана?

1 Ответ

0 голосов
/ 02 мая 2020

Сначала нормализуйте вашу схему.

У вас должна быть одна таблица связей для альянсов и одна для оппозиций.

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 является столбцом синглов называется id типа integer(11) unsigned. Вам может потребоваться изменить типы и ограничения внешнего ключа, если допущение неверно.

В более старых версиях MySQL (особенно менее 8) проверочные ограничения не работают (они анализируются при создании таблицы но не применяется при вставке данных). Поэтому вам может понадобиться создать триггеры для их замены.

Обратите внимание, что в этих таблицах не должно быть столбца для имени клана. Такой столбец будет избыточным, у вас уже есть имена в clan.

Чтобы затем сделать все кланы противостоящими друг другу, вы можете использовать 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. В противном случае все может стать грязным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...