先来看两个建表语句:
CREATE TABLE `categories` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '分类id',
`cname` VARCHAR(32) NOT NULL COMMENT '分类名称',
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
CREATE TABLE `news` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`c_id` int unsigned NOT NULL COMMENT '分类id',
`imgsrc` varchar(255) NOT NULL,
`href` varchar(255) NOT NULL,
`date` date NOT NULL,
`title` varchar(255) NOT NULL,
`detail` text NOT NULL,
`create_at` datetime DEFAULT CURRENT_TIMESTAMP,
`update_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
foreign key (c_id) references categories(id) on update cascade on delete set null
) ENGINE=innodb auto_increment=1 DEFAULT CHARSET=utf8
在建立news表的时候一直报错:(errno: 150 "Foreign key constraint is incorrectly formed")
很多网上说是 必须再建立news表的时候需要为c_id添加上索引(index c_id(`c_id`)),我试了不行
然后网上还说两个表必须都是innodb的引擎,我这个也没有问题
看报错说是字段类型不一致,我看了一下,都是int 类型,都是not null,那为什么始终说类型不一致呢
看了半天才知道,确实是建立外键的时候出的错,看 on delete set null 那段,意思是说在删除分类表中的id的时候,news表中的对应的c_id变为null了
问题就是出在这里,因为c_id是not null,所以出错,
所以想建立news 表有两种办法
1.将c_id 的not null去掉
2.将on delete set null 改为 on delete restrict 或者 on delete cascade 或者 on delete no action