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;
Все еще ничего...: (
Ответы
Ответ 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