Подтвердить что ты не робот

MySQL: какая разница между INDEX, UNIQUE, FOREIGN KEY и PRIMARY KEY?

Хорошо, так что я новичок здесь на SQL..

Я настраиваю свои таблицы, и я запутался в индексах, ключах, внешних ключах.

У меня есть таблица пользователей, а таблица проектов

Я хочу использовать пользователей (id) для присоединения проекта к пользователю.

это то, что у меня есть до сих пор.

DROP TABLE IF EXISTS projects;

CREATE TABLE projects (
    id int(8) unsigned NOT NULL,
    user_id int(8),
    name varchar(120) NOT NULL,
    description varchar(300),
    created_at date,
    updated_at date,
    PRIMARY KEY (id),
    KEY users_id (user_id)
) ENGINE=InnoDB;

ALTER TABLE projects (
    ADD CONSTRAINT user_projects,
    FOREIGN KEY (user_id) REFERENCES users(id),
    ON DELETE CASCADE
)

Итак, что я теряю, каковы различия между ключом, индексом, ограничением и внешним ключом?

Я смотрю онлайн и не могу найти для него новое объяснение.

пс. Я использую phpactiverecord и устанавливаю отношения в моделях

user- > has_many ('projects'); projects → принадлежит_to ('пользователь');

не уверен, что это имеет к этому какое-то отношение, но подумал, что я брошу его там.

Спасибо.

EDIT:

Я думал, что это может быть чем-то связано с navicat, поэтому я пошел в mamps phpmyadmin и запустил это...

ТАБЛИЦА DROP TABLE IF EXISTS,

CREATE TABLE projects (
    id int(8) unsigned NOT NULL,
    user_id int(8) NOT NULL,
    name varchar(120) NOT NULL,
    description varchar(300),
    created_at date,
    updated_at date,
    PRIMARY KEY (id),
    KEY users_id (user_id),
    FOREIGN KEY (user_id) REFERENCES users(id)
) ENGINE=InnoDB;

Все еще ничего...: (

4b9b3361

Ответ 1

Расширение ответов Шамиля:

INDEX похож на индекс в конце книги. Он обеспечивает упрощенный поиск данных в этом столбце, чтобы поиск на нем был быстрее. MyISAM использует хэш-таблицу для хранения индексов, которые сортируют данные, но по-прежнему линейно пропорциональны по глубине размеру таблицы. InnoDB использует структуру B-tree для своих индексов. B-дерево похоже на вложенный набор - он разбивает данные на логические дочерние группы, что означает, что глубина поиска значительно меньше. Таким образом, поиск по диапазонам быстрее в B-дереве.

UNIQUE INDEX - это индекс, в котором каждая строка в базе данных должна иметь уникальное значение для этого столбца. Это полезно для предотвращения дублирования, например. для столбца электронной почты в таблице пользователей, где требуется только одна учетная запись на адрес электронной почты. Важно отметить, что в MySQL предложение ON DUPLICATE KEY UPDATE будет запускаться, если оно находит дубликат уникального индекса, даже если это не ваш первичный ключ. Это ошибка, о которой следует помнить, если у вас есть уникальный по электронной почте, например.

PRIMARY KEY - это UNIQUE INDEX, который является идентификатором для любой строки в таблице. Таким образом, он не должен быть null и сохраняется как кластеризованный индекс. Clustered означает, что данные в вашей таблице сортируются в порядке возрастания на PK. Это делает поиск по первичному ключу значительно быстрее, чем любой другой тип индекса (как в MySQL, только ПК может быть вашим кластеризованным индексом). Обратите внимание, что кластеризация также вызывает проблемы с операторами INSERT, если ваши данные не AUTO_INCREMENTed, так как MySQL должен будет перемещать данные, если вы вставляете новую строку с PK с более низким порядковым значением. Это может помешать работе вашей базы данных.

FOREIGN KEY - ссылка на столбец в другой таблице. Он обеспечивает ссылочную целостность, а это означает, что вы не можете создать запись в столбце, который имеет внешний ключ для другой таблицы, если введенное значение не существует в ссылочной таблице. В MySQL FOREIGN KEY не улучшает производительность поиска. Это также требует, чтобы обе таблицы в определении ключа использовали движок InnoDB и имели одинаковый тип данных, набор символов и сопоставление.

Ответ 2

KEY - это еще одно слово для INDEX.

УНИКАЛЬНЫЙ индекс означает, что все значения внутри этого индекса должны быть уникальными и не совпадать с ant другими в этом индексе. Примером может служить столбец идентификатора в таблице.

PRIMARY KEY - уникальный индекс, где все ключевые столбцы должны быть определены как NOT NULL, т.е. все значения в индексе должны быть установлены. В идеале каждая таблица должна иметь (и может иметь) только один первичный ключ.

A FOREIGN KEY - это ссылочное ограничение между двумя таблицами. Этот столбец/индекс должен иметь тот же тип и длину, что и упомянутый столбец в указанной таблице. Примером FOREIGN KEY является userId, между таблицей входа пользователя и таблицей пользователей. Обратите внимание, что он обычно указывает на ПЕРВИЧНЫЙ КЛЮЧ в указанной таблице.

http://dev.mysql.com/doc/refman/5.1/en/create-table.html