Исчезающие чужие ключи в phpMyAdmin - PullRequest
6 голосов
/ 17 ноября 2008

Я создаю новую таблицу внутри mysql и пытаюсь добавить ограничение внешнего ключа к одному из полей.

CREATE TABLE `onlineorder` (
  `receiptid` varchar(10) NOT NULL default '',
  `delivereddate` date default NULL,
  `cid` int(10) NOT NULL,
  `card#` int(10) default NULL,
  `expire` date default NULL,
  PRIMARY KEY  (`receiptid`),
  FOREIGN KEY (receiptid) REFERENCES purchase
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Однако после его создания я захожу в phpMyAdmin и экспортирую таблицу. и кажется, что ограничение внешнего ключа исчезло.

CREATE TABLE `onlineorder` (
  `receiptid` varchar(10) NOT NULL default '',
  `delivereddate` date default NULL,
  `cid` int(10) NOT NULL,
  `card#` int(10) default NULL,
  `expire` date default NULL,
  PRIMARY KEY  (`receiptid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

phpMyAdmin избавляется от внешних ключей или я что-то здесь не так делаю?

Ответы [ 4 ]

8 голосов
/ 17 ноября 2008

Вам нужно использовать движок InnoDB, чтобы иметь внешние ключи.

Ссылка: http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html

6 голосов
/ 18 ноября 2008

Когда вы определяете таблицу с помощью механизма хранения MyISAM, она принимает ограничения FOREIGN KEY, но молча отбрасывает их. Он анализирует их, но не сохраняет ограничение в метаданных таблицы и впоследствии не может применить ограничение. Когда вы просите взглянуть на идею базы данных относительно определения таблицы, она ничего не знает об этом ограничении, как вы узнали.

То же самое происходит с CHECK ограничениями (независимо от механизма хранения); он анализирует синтаксис и принимает его, но затем игнорирует его.

ИМХО, это ужасная вещь для продукта MySQL. Он принимает стандартный SQL без ошибок, создавая впечатление, что он будет поддерживать ограничение стандартным способом. Но это не так! Даже SHOW WARNINGS не показывает, что MySQL игнорирует ограничение.

Если вы используете механизм хранения InnoDB, он учитывает ограничение внешнего ключа.

1 голос
/ 20 мая 2011

Кроме того, PHPMyAdmin удаляет извлечения любых ОГРАНИЧЕНИЙ до тех пор, пока все таблицы не будут созданы и данные не будут вставлены. Если вы используете PHPMySql для создания дампа таблицы, в конце файла вы найдете раздел таблицы UPDATE со всеми вашими записями ADD CONSTRAINT.

0 голосов
/ 16 февраля 2016

При управлении таблицами с помощью phpmyadmin существует два типа ограничений:

  • internal: когда вы устанавливаете ограничения в конструкторе phpmyadmin, например, ограничения, хранящиеся как внутренние, они не будут включены в экспорт.
  • innoDB: эти ограничения, включенные в экспорт, проверяют связанное видео об этом

[Видео: настройка ограничения внешнего ключа] [1]

...