Сбой ограничения внешнего ключа с Zend_Db_Table - PullRequest
0 голосов
/ 25 августа 2011

У меня есть таблицы и их 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) ССЫЛКИ item (itemID) )

1 Ответ

0 голосов
/ 25 августа 2011

Если вы хотите удалить запись из родительской таблицы, сначала вы должны удалить связанные записи в дочерней таблице.Также вы можете добавить 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.

...