Да, внешний ключ может быть сделан для принятия NULL
значений:
CREATE TABLE folders (
id int NOT NULL PRIMARY KEY,
parent_id int NULL,
FOREIGN KEY (parent_id) REFERENCES folders (id)
) ENGINE=InnoDB;
Query OK, 0 rows affected (0.06 sec)
INSERT INTO folders VALUES (1, NULL);
Query OK, 1 row affected (0.00 sec)
На время выполнения не влияет, если внешний ключ установлен для приема значений NULL
или нет.
ОБНОВЛЕНИЕ: Далее к комментарию ниже:
Имейте в виду, что индексы B-дерева наиболее эффективны для данных с большим количеством элементов (т. Е. Столбцов с множеством возможных значений, где данные в столбце уникальны или почти уникальны). Если у вас будет много значений NULL
(или любое другое повторяющееся значение), оптимизатор запросов может решить не использовать индекс для фильтрации записей для вашего набора результатов, поскольку это будет быстрее, чем не делать этого. Однако эта проблема не зависит от того, является ли столбец внешним ключом или нет.