Tenho as seguintes tabelas:
// Base Scans
CREATE TABLE `basescans` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(100) NULL DEFAULT NULL,
`status_id` INT(10) UNSIGNED NULL DEFAULT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `status_id_fk` FOREIGN KEY (`status_id`) REFERENCES `statuses` (`id`) ON UPDATE CASCADE ON DELETE SET NULL
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
ROW_FORMAT=COMPACT
AUTO_INCREMENT=29
// Statuses
CREATE TABLE `statuses` (
`id` INT(10) UNSIGNED NULL AUTO_INCREMENT,
`name` VARCHAR(100) NULL DEFAULT NULL,
PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
ROW_FORMAT=DEFAULT
AUTO_INCREMENT=4
Tentar salvar a primeira tabela falha quando coloco essa restrição de chave estrangeira. Não consigo descobrir por quê. Ambas as colunas referenciadas na restrição têm o mesmo tipo, tamanho, etc:
INT(10) UNSIGNED NULL
Eles só têm um valor padrão de diferença. Um tem um valor padrão de NULL, o outro é AUTO_INCREMENT. Eu não acho que isso fez diferença para restrições de chave estrangeira, mas posso estar errado.
Ambas as tabelas são InnoDB e UFT8. O que estou perdendo aqui?
ATUALIZADO: Meu erro específico:
/* SQL Error (1452): Cannot add or update a child row: a foreign key constraint fails (`db`.<result 2 when explaining filename '#sql-31c2_22ac1e1'>, CONSTRAINT `status_id_fk` FOREIGN KEY (`status_id`) REFERENCES `statuses` (`id`) ON DELETE SET NULL ON UPDATE CASCADE) */
Você precisa já ter declarado a tabela à qual a chave estrangeira faz referência, antes de poder definir uma chave estrangeira que a referencie.
Depois de declarar a segunda tabela, você pode declarar a primeira tabela. Testado aqui no MySQL 5.5.27.
Se você precisar ignorar a validação, você pode fazer isso:
http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_foreign_key_checks
Usando as consultas 1 e 2 para descartar sua tabela
1) SET FOREIGN_KEY_CHECKS = 0;
2) DROP TABLE NomeTabela;
Aqui o TableName, qual tabela você deseja descartar