mysql建表外键约束的问题

先来看两个建表语句:

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

猜你喜欢

转载自blog.csdn.net/silk_java/article/details/56479808