Ограничение внешнего ключа не работает с Zend_Db_Table

У меня есть таблицы, и их SQL выглядит следующим образом:

CREATE TABLE item (
itemID INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL,
name VARCHAR(100) NOT NULL,
price FLOAT NOT NULL,
stock INTEGER NOT NULL
) ENGINE = InnoDB;


CREATE TABLE salesrecord (
recordID INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL,
itemID INT UNSIGNED NOT NULL,
recordDate DATE NOT NULL,
FOREIGN KEY (itemID) REFERENCES item (itemID)
) ENGINE = InnoDB;

А это мои конкретные классы Zend_Db_Table:

<?php
class Store_Model_Items extends Zend_Db_Table_Abstract
{
  protected $_name = 'item';
  protected $_rowClass = 'Store_Model_Item';
  protected $_dependTables = array('Store_Model_SalesRecords');
}


<?php
class Store_Model_SalesRecords extends Zend_Db_Table_Abstract
{
  protected $_name = 'salesrecord';
  protected $_referenceMap = array(
    'Item' => array(
        'columns' => array('itemID'),
        'refTableClass' => 'Store_Model_Items',
        'refColumns' => array('itemID'),
        'onDelete' => self::CASCADE
    )
  );
} 

Когда я пытаюсь удалить строку в таблице элементов, я получаю это сообщение:

SQLSTATE [HY000]: общая ошибка: 1451 Невозможно удалить или обновить родительскую строку: ограничение внешнего ключа не работает (newstore/salesrecord, CONSTRAINT salesrecord_ibfk_1 FOREIGN KEY (itemID) REFERENCES item (itemID))


person Trantor Liu    schedule 25.08.2011    source источник


Ответы (1)


Если вы хотите удалить запись из родительской таблицы, сначала вы должны удалить связанные записи в дочерней таблице. Также вы можете добавить проверку ON DELETE CASCADE, это поможет автоматически удалять связанные записи в дочерней таблице. Попробуйте воссоздать свой FK таким образом -

ALTER TABLE salesrecord
  DROP FOREIGN KEY salesrecord_ibfk_1; -- change FK name here!

ALTER TABLE salesrecord
  ADD CONSTRAINT salesrecord_ibfk_1 FOREIGN KEY (itemID)
    REFERENCES item(itemID) ON DELETE CASCADE;

Измените «salesrecord_ibfk_1» на фактическое имя FK.

person Devart    schedule 25.08.2011