Создание ограничения внешнего ключа с несколькими полями в MySQL innodb - PullRequest
2 голосов
/ 07 июля 2011

У меня есть две таблицы: invoice & invoice_items.Мне нужно отношение один ко многим между двумя с каскадным удалением (поэтому, если счет удаляется, элементы также удаляются).

Первичный ключ в счетах охватывает два столбца: invoice_number, vendor_number

Первичный ключ в invoice_items охватывает три столбца: invoice_number, vendor_number, item_number

Как добавить ограничение внешнего ключа в таблицу invoice_items с помощью столбцов invoice_number & vendor_number?

Я пыталсяи это не сработало:

ALTER TABLE `invoice_items`
ADD FOREIGN KEY (`invoice_number`,`vendor_number`)
REFERENCES `invoices`(`invoice_number`,`vendor_number`) ON DELETE CASCADE;

ERROR 1005 (HY000): Can't create table 'test_db.#sql-12c8_db1ad' (errno: 150)

Вот определения таблиц:

CREATE TABLE IF NOT EXISTS `invoices` (
  `vendor_number` varchar(20) NOT NULL,
  `invoice_number` varchar(20) NOT NULL,
  `po_number` varchar(50) NOT NULL,
  `inbound_message_id` int(11) NOT NULL,
  `created_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`vendor_number`,`invoice_number`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS `invoice_items` (
  `vendor_number` varchar(20) NOT NULL,
  `invoice_number` varchar(20) NOT NULL,
  `po_item_number` varchar(6) NOT NULL,
  `quantity` float NOT NULL,
  `amount` decimal(10,2) NOT NULL COMMENT 'Total amount invoiced for this line item',
  PRIMARY KEY (`vendor_number`,`invoice_number`,`po_item_number`),
  KEY `invoice_key` (`vendor_number`,`invoice_number`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Вот вывод из статуса show innodb:

110707 12:26:19 Error in foreign key constraint of table test_db/#sql-12c8_dcbfb:
FOREIGN KEY (`invoice_number`,`vendor_number`)
REFERENCES `invoices`(`invoice_number`,`vendor_number`) ON DELETE CASCADE:
Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.
Note that the internal storage type of ENUM and SET changed in
tables created with >= InnoDB-4.1.12, and such columns in old tables
cannot be referenced by such columns in new tables.
See http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html
for correct foreign key definition.

1 Ответ

5 голосов
/ 07 июля 2011

Используйте show innodb status. Это выгрузит большой блок текста. Где-то посередине «последняя ошибка внешнего ключа». Он будет содержать более подробную информацию о том, почему не удалось изменить таблицу.

Одна из возможностей - несоответствие типов полей. Ключевые поля должны быть точными дубликатами в обеих таблицах. Вы не можете связать подписанное поле с неподписанным или int с bigint и т. Д ...

...