我正在研究一个小的支持(票务)系统。我的桌子是门票和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;