Внешний ключ с составным первичным ключом не работает в MySql - PullRequest
2 голосов
/ 24 июня 2011

У меня есть следующий сценарий SQL.После запуска отношения внешнего ключа никогда не применяются.

CREATE TABLE Country (
  name varchar(40) NOT NULL,
  abbreviation varchar(4) NOT NULL,
  PRIMARY KEY  (name)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

CREATE TABLE StateProvince (
  countryName varchar(40) NOT NULL,
  name varchar(100) NOT NULL,
  abbreviation varchar(3) NOT NULL,
  PRIMARY KEY  (countryName,name)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

alter table StateProvince
add index FK_StateProvince_Country (countryName),
add constraint FK_StateProvince_Country
foreign key (countryName)
references Country (name);

Это из-за составного первичного ключа?

Ответы [ 4 ]

1 голос
/ 24 июня 2011

Только движок InnoDB поддерживает внешние ключи :

InnoDB поддерживает ограничения внешнего ключа.

1 голос
/ 24 июня 2011

Согласно документации MySQL по внешним ключам , механизм таблиц MyISAM не поддерживает внешние ключи.Вместо этого он молча игнорирует их.Вместо этого используйте InnoDB.Попробуйте это:

CREATE TABLE Country (
  name varchar(40) NOT NULL,
  abbreviation varchar(4) NOT NULL,
  PRIMARY KEY  (name)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

CREATE TABLE StateProvince (
  countryName varchar(40) NOT NULL,
  name varchar(100) NOT NULL,
  abbreviation varchar(3) NOT NULL,
  PRIMARY KEY  (countryName,name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

alter table StateProvince
add index FK_StateProvince_Country (countryName),
add constraint FK_StateProvince_Country
foreign key (countryName)
references Country (name);
0 голосов
/ 24 июня 2011

@Benju.

Вы должны заменить MyISAM на InnoDB, а затем вы можете использовать первичный ключ как составной или одиночный. Это работает, и я проверил.

0 голосов
/ 24 июня 2011

Это не имеет к этому никакого отношения, согласно этой статье

http://dev.mysql.com/doc/refman/5.0/en/example-foreign-keys.html

Ограничение внешнего ключа не требуется просто для объединения двух таблиц. Для механизмов хранения, отличных от InnoDB, возможно, при определении столбца использовать предложение REFERENCES tbl_name (col_name), которое не имеет никакого действительного эффекта и служит только для напоминания или комментария к вам, что столбец, которыйВы в настоящее время определяете, предназначен для ссылки на столбец в другой таблице.При использовании этого синтаксиса крайне важно понимать, что:

...