我必须在MySQL中创建一个包含两个表的数据库,但脚本失败并返回errno150(外键问题)。我仔细检查了两个表中的外键字段是否相同,但没有发现任何错误。
下面是脚本:
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';
DROP SCHEMA IF EXISTS `testdb`;
CREATE SCHEMA IF NOT EXISTS `testdb` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
USE `testdb`;
DROP TABLE IF EXISTS `testdb`.`table1` ;
CREATE TABLE IF NOT EXISTS `testdb`.`table1` (
`id` INT UNSIGNED NOT NULL ,
`field1` VARCHAR(50) NULL ,
PRIMARY KEY (`id`) )
ENGINE = InnoDB;
DROP TABLE IF EXISTS `testdb`.`table2` ;
CREATE TABLE IF NOT EXISTS `testdb`.`table2` (
`id` INT NOT NULL AUTO_INCREMENT ,
`field1` VARCHAR(50) NULL ,
`date` DATE NULL ,
`cnt` INT NULL ,
PRIMARY KEY (`id`) ,
INDEX `FK_table2_table1` (`field1` ASC) ,
CONSTRAINT `FK_table2_table1`
FOREIGN KEY (`field1`)
REFERENCES `testdb`.`table1` (`field1` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
我用不同版本的MySQL在Windows和Ubuntu上试过,都不起作用。
有什么想法吗?
发布于 2009-11-17 22:46:18
table1.field1
上没有定义索引。
在field1
上放置FOREIGN KEY
约束是必需的。
有了这个:
CREATE TABLE IF NOT EXISTS `testdb`.`table1` (
`id` INT UNSIGNED NOT NULL ,
`field1` VARCHAR(50) NULL ,
KEY ix_table1_field1 (field1),
PRIMARY KEY (`id`) )
ENGINE = InnoDB;
然后一切都应该像预期的那样工作。
发布于 2013-05-11 04:26:21
在使用MySQL工作台和MySQL 5.5.27时,我遇到了类似的问题。在我的例子中,问题是INT类型字段。错误的是,在一个表中,它是INT UNSIGNED,而在引用表中,它是INT。
发布于 2009-11-17 22:45:29
根据MySQL的版本,您可能需要首先在table1.field1上创建一个索引。
https://stackoverflow.com/questions/1749332
复制相似问题