Вопрос

У меня есть следующий скрипт для создания таблицы в MySQL версии 5.1, которая должна ссылаться на 3 другие таблицы. Все 3 таблицы были созданы с использованием InnoDB, и все 3 таблицы имеют столбец ID, определенный как INT.

Я успешно создал другие таблицы, которые ссылаются на ACCOUNT и PERSON, однако это первая таблица, которая ссылается на ADDRESS, поэтому я также включил определение этой таблицы, как run, ниже.

Я получаю ошибку ERROR 1005 (HY000) с ошибкой 150, которая, как я понимаю, связана с созданием внешнего ключа.

Сценарий, который не работает (лишние столбцы удалены для простоты):

CREATE TABLE WORK_ORDER (
    ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ACCOUNT_ID INT NOT NULL,
    CUSTOMER_ID INT NOT NULL,
    SALES_ID INT,
    TRADES_ID INT,
    LOCATION_ID INT NOT NULL,
    INDEX CUST_INDEX(CUSTOMER_ID),
    INDEX SALES_INDEX(SALES_ID),
    INDEX TRADES_INDEX(TRADES_ID),
    INDEX ACCOUNT_INDEX(ACCOUNT_ID),
    INDEX LOCATION_INDEX(LOCATION_ID),
    FOREIGN KEY (CUSTOMER_ID) REFERENCES PERSON(ID) ON DELETE CASCADE,
    FOREIGN KEY (SALES_ID) REFERENCES PERSON(ID) ON DELETE SET NULL,
    FOREIGN KEY (TRADES_ID) REFERENCES PERSON(ID) ON DELETE SET NULL,
    FOREIGN KEY (ACCOUNT_ID) REFERENCES ACCOUNT(ID) ON DELETE CASCADE,
    FOREIGN KEY (LOCATION_ID) REFERENCES ADDRESS(ID) ON DELETE SET NULL
) ENGINE=InnoDB;

Оператор SQL, использованный для создания таблицы ADDRESS, приведен ниже (дополнительные столбцы удалены для простоты).

CREATE TABLE ADDRESS (
    ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    PERSON_ID INT NOT NULL,
    ACCOUNT_ID INT NOT NULL,
    ADDRESS_L1 VARCHAR(50),
    ADDRESS_L2 VARCHAR(50),
    CITY VARCHAR(25),
    PROVINCE VARCHAR(20),
    POSTAL_CODE VARCHAR(6),
    COUNTRY VARCHAR(25),
    INDEX CUST_INDEX(PERSON_ID),
    INDEX ACCOUNT_INDEX(ACCOUNT_ID),
    FOREIGN KEY (ACCOUNT_ID) REFERENCES ACCOUNT(ID) ON DELETE CASCADE,
    FOREIGN KEY (PERSON_ID) REFERENCES PERSON(ID) ON DELETE CASCADE
) ENGINE=InnoDB;

Я просмотрел здесь несколько вопросов, касающихся сходных проблем, но большинство, похоже, являются дублирующими определениями и несовпадающими типами полей, а также некоторые из них не используют InnoDB для одной или другой таблицы. Тем не менее, ни один из них, похоже, не является проблемой. Есть идеи?

Это было полезно?

Решение

Вы всегда можете выполнить команду «SHOW ENGINE INNODB STATUS». В выводе будет «ОШИБКА ПОСЛЕДНЕЙ НЕСКОЛЬКО КЛЮЧЕЙ» раздел, в котором будет больше подробностей о том, что именно вызвало ошибку «150»:

mysql> create table a (x int not null) type=innodb;
Query OK, 0 rows affected, 1 warning (0.02 sec)

mysql> create table b (y int not null, foreign key (y) references a (x) on delete set null) type=innodb;
ERROR 1005 (HY000): Can't create table './test/b.frm' (errno: 150)

mysql> show engine innodb status;
[..... snip snip snip ...]
------------------------
LATEST FOREIGN KEY ERROR
------------------------
091129 16:32:41 Error in foreign key constraint of table test/b:
foreign key (y) references a (x) on delete set null) type=innodb:
You have defined a SET NULL condition though some of the
columns are defined as NOT NULL.
[.... snip snip snip ...]
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top