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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

micro_cloud_fly

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值