Чем отличается constraint от foreign key?
Вы путаете сладкое с мягким.
Constraint ограничение - когда вы задаёте параметры таблицы при помощи create/alter table
вы говорите, что для такого-то поля задаётся constraint (ограничение).
Ограничениями может быть primary key, foreign key, unique, default, check и т. д. - это всё ограничения.
Вот таблица:CREATE TABLE MYTABLE  (
   ID BIGINT NOT NULL CONSTRAINT PK_MYTABLE PRIMARY KEY,
   CLIENT BIGINT NOT NULL CONSTRAINT FK_MYTABLE_CLIENT FOREIGN KEY REFERENCES CLIENTS(ID),
   EMAIL NVARCHAR(100) NOT NULL CONSTRAINT UQ_MYTABLE_EMAIL UNIQUE,
   ACTIVE BIT NOT NULL CONSTRAINT DF_MYTABLE_ACTIVE DEFAULT (1)
)
Что переводится как:
Создать таблицу MYTABLE (с полями):
  ID целое 64 бит, не допускать пустых, ограничение с названием PK_MYTABLE вида "Первичный ключ",
  CLIENT целое 64 бит, не допускать пустых, ограничение с названием FK_MYTABLE_CLIENT вида "Внешний ключ", который ссылается на таблицу CLIENTS, поле ID,
  EMAIL строковое длиной 100, не допускать пустых, ограничение с названием UQ_MYTABLE_EMAIL вида "Должно быть уникальным",
  ACTIVE бит, не допускать пустых, органичение с названием DF_MYTABLE_ACTIVE вида "Значение по умолчанию" равное 1
Есть и альтернативный синтаксис, где ключевое слово constraint не используется. 
В основном его применяют, когда надо явно задать имя на ограничение.
foreign keyСвязь с другой таблицей.constraintОграничение. Может быть не связано с другой таблицей. Например, дата ограничена определённым периодом.