Ссылка на внешний ключ в mysql innodb - PullRequest
0 голосов
/ 24 декабря 2009

Проще говоря: у меня есть таблица с 2 столбцами: один - имя пользователя, а другой - ник. У меня есть другая таблица, где у меня есть 2 столбца: один - имя пользователя, а другой - countNicknames.

Я хочу, чтобы countNicknames содержал количество псевдонимов, которые есть у каждого пользователя (и всякий раз, когда я вставляю новый псевдоним в table1, значение в table2.countNicknames автоматически обновляется.

Не могли бы вы написать, как построить вторую таблицу для ссылки на первую?

Ответы [ 3 ]

5 голосов
/ 24 декабря 2009

Почему бы просто не посчитать, когда вам нужно значение?

1 голос
/ 24 декабря 2009

Я хочу, чтобы countNicknames содержал количество псевдонимов каждого пользователя (и всякий раз, когда я вставляю новый псевдоним в table1, значение в table2.countNicknames будет автоматически обновляться.

Это фактически то, что будет делать представление.

CREATE OR REPLACE VIEW user_nickname_count AS
    SELECT t.username,
           COUNT(*) 'countNicknames'
      FROM TABLE t
  GROUP BY t.username

Представление выглядит как таблица, так что вы можете присоединиться к ней, если это необходимо. И единственная дополнительная нагрузка - это то, что фактически выполняется просто запрос SELECT - значения вычисляются по требованию, а не для настройки триггеров.

Подробнее о просмотрах см. В документации .

1 голос
/ 24 декабря 2009

Ну, предложение @ Лассе лучше, но ... есть два других других варианта ...

  1. Есть ли в MySql триггеры? Если это так, то вы бы добавили триггер Вставить, Обновить, Удалить в первую таблицу, который обновляет (или вставляет или удаляет при необходимости) атрибут CountNickNames второй таблицы каждый раз, когда запись вставляется, обновляется или удаляется из первой таблицы. .

    Создать триггер NickNameCountTrig On NickNameCountTable Для вставки, обновления, удаления Как Обновление набора nct CountNickNames = (Выберите количество () в первой таблице Где имя = нкт. Имя) Из NickNameCountTable нкт Где имя в (выберите отличительное имя от вставленного союз Выберите отличительное имя из удаленных) - ----------------------------------------------- Вставить NickNameCountTable (Name, CountNickNames) Выберите имя, количество () в футе FirstTable Где не существует (Выберите * из NickNameCountTable Где Name = ft.Name) - ------ Это необязательно ----------------------- Удалить NickNameCountTable Где CountNickNames = 0

  2. Есть ли в MySql индексированные представления (или некоторые эквивалентные)? видимо нет - так что не бери в голову этот вариант ....

...