Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




MySQL.RU - Webboard



Вернуться
индекс создаётся без команды INDEX? (mich) 04/01/2008 - 15:18:55
      Re: доп инфо: (mich) 04/01/2008 - 15:46:49
      Re: догадка: создаётся и ... (mich) 04/01/2008 - 16:53:21
      Re: а вот и объяснение этому (vi.k) 04/01/2008 - 18:18:17

> Original message text:
> From: mich - 04/01/2008 - 15:18:55
> Subject:индекс создаётся без команды INDEX?
> -----------------
> Здравствуйте,
>
> вопрос возник по результатам другой темы.
>
> Я создаю т-цу
>
> CREATE TABLE lists_view_log (
> list_id INT UNSIGNED NOT NULL,
> user_id INT UNSIGNED DEFAULT NULL,
> view_at DATETIME NOT NULL,
> ip CHAR(15) DEFAULT NULL,
> FOREIGN KEY (list_id) REFERENCES lists(id) ON DELETE CASCADE,
> FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL
> ) ENGINE=InnoDB;
>
> При этом автоматически возникают 2 индекса для столбцов
> list_id и user_id.
>
> В документации нашел только это:
>
> 7.5.11 Структуры таблиц и индексов
> Для всех таблиц InnoDB есть специальный индекс, в котором хранятся данные строк - он называется кластеризованным индексом. Если в таблице определить PRIMARY KEY, то индекс первичного ключа будет кластеризированным индексом.
> ...
> Если первичный ключ для таблицы не определен, то InnoDB самостоятельно создаст кластеризированный индекс;
>
> 1-й вопрос - почему у меня их два? Для каждого FOREIGN KEY? Нет, см. ниже.
>
> Далее, Я создаю т-цу с INDEX idx
>
> CREATE TABLE lists_view_log (
> list_id INT UNSIGNED NOT NULL,
> user_id INT UNSIGNED DEFAULT NULL,
> view_at DATETIME NOT NULL,
> ip CHAR(15) DEFAULT NULL,
> INDEX idx (list_id, user_id),
> FOREIGN KEY (list_id) REFERENCES lists(id) ON DELETE CASCADE,
> FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL
> ) ENGINE=InnoDB;
>
> При этом возникают 2 индекса idx и для столбца user_id. А для list_id нет, хоть он и FOREIGN KEY.
> А мне как раз нужен list_id.
>
> 2 вопрос - как убрать индекс для столбца user_id?
>
> Далее, Я добавляю в т-цу INDEX list_id
>
> CREATE TABLE lists_view_log (
> list_id INT UNSIGNED NOT NULL,
> user_id INT UNSIGNED DEFAULT NULL,
> view_at DATETIME NOT NULL,
> ip CHAR(15) DEFAULT NULL,
> INDEX idx (list_id, user_id),
> INDEX list_id (list_id),
> FOREIGN KEY (list_id) REFERENCES lists(id) ON DELETE CASCADE,
> FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL
> ) ENGINE=InnoDB;
>
> Теперь есть все 3 индекса.
> 2 вопрос - как убрать индекс для столбца user_id - еще актуальней!
>
>
>
>


From: vi.k - 04/01/2008 - 18:18:17
Subject:а вот и объяснение этому
-----------------
Спасибо за материал, я и не знал, что всё так.

Нашёл теоретическое объяснение этому (в документации к 5.0):

In the referencing table, there must be an index where the foreign key columns are listed as the first columns in the same order. Such an index is created on the referencing table automatically if it does not exist.


Заодно рекомендую смотреть SHOW CREATE TABLE как на пример того, как в действительности создаётся таблица. Поучительно.


[Это сообщение - спам!]

Последние сообщения из форума

Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
32718



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |