mysql 外键(完整性约束冲突)


mysql foreign key (Integrity constraint violation)

我正在研究一个小的支持(票务)系统。我的桌子是门票和ticket_replies。

票务表设计是

id|user_id|title|...

ticket_replies的设计看起来像:

id|ticket_id|...

现在我想创建一个从票证表到ticket_replies表的外键。此外键应防止在未事先编辑票证表的情况下编辑ticket_replies表。例如,如果票证的 id 更改,则ticket_id也应该在"ticket_replies"中更改。如果在工单中删除了工单,它也应该在"ticket_replies"中删除。

我添加的外键如下所示:

ALTER TABLE `tickets` ADD FOREIGN KEY (`id`) REFERENCES `sampleauth`.`ticket_replies`(`ticket_id`) ON DELETE CASCADE ON UPDATE CASCADE;

创建这个外键是成功的,但是当我尝试插入数据时,如下所示:

            $ticket = new Ticket;
            $ticket->user_id = $user->id;
            $ticket->title = $request->title;
            $ticket->status = 0;
            $ticket->department_id = $request->departments;
            $ticket->save();
            //create new ticket_replie
            $ticket_replie = new Ticket_replie;
            $ticket_replie->ticket_id = $ticket->id;
            $ticket_replie->user_id = $user->id;
            $ticket_replie->text = $request->question;
            $ticket_replie->save();

它失败说:

完整性约束冲突:1452 无法添加或更新子行: 外键约束失败(sampleauth.tickets, CONSTRAINT tickets_ibfk_1外键 (ID) 引用 ticket_replies (ticket_id) 在更新级联上删除级联)(SQL:插入到工单中 (user_id、标题、状态、department_id、updated_at created_at)值 (1, sasa, 0, 1

, 2016-01-18 23:03:21, 2016-01-18 23:03:21))

我理解为什么会发生这种情况(因为当我创建新票证时,Mysql 会检查ticket_replies ticket_id是否与ticket_id匹配),但我不知道如何解决这个问题,知道吗?

那些会起作用

ALTER TABLE `tickets` DROP FOREIGN KEY `ticket_ibfk_1`;
ALTER TABLE ticket_replies ADD FOREIGN KEY (ticket_id) REFERENCES ticket(id) ON DELETE CASCADE ON UPDATE CASCADE;

这些是我运行的完整测试代码。

CREATE TABLE `tickets` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(45) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
CREATE TABLE `ticket_replies` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `ticket_id` int(10) unsigned NOT NULL,
  `reply` varchar(45) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
ALTER TABLE ticket_replies ADD FOREIGN KEY (ticket_id) REFERENCES tickets(id) ON DELETE CASCADE ON UPDATE CASCADE;
insert into tickets(name) values('123');
insert into ticket_replies(ticket_id, reply) values(LAST_INSERT_ID(),'123');
您需要

ticket_replies引用票证到票证

这是常见的规则:

当您命名像 {table_name}_id (ticket_replies.ticket_id 这样的列时,您需要将其引用到 {table_name}.id (ticket.id)。

因此,您需要删除现有外键并创建新的:

ALTER TABLE tickets DROP FOREIGN KEY (id);
ALTER TABLE ticket_replies ADD FOREIGN KEY (ticket_id) REFERENCES ticket(id) ON DELETE CASCADE ON UPDATE CASCADE;
相关文章: