是否可以创建可能不具有相同值的2个字段?

时间:2010-01-24 20:28:05

标签: mysql django django-models

说我有票,这张票有一个所有者和一个接受者。创建故障单并将接受者ID设置为默认值为NULL时,将设置所有者ID。在这种情况下,接受者可能也不是所有者。我知道这在编程逻辑中是微不足道的,但我想知道它是否可以在数据库中完成。

将两个字段设置为唯一:UNIQUE(owner_id, taker_id);不会工作,因为所有者可以同时拥有许多非拍摄的故障单。也许是三个唯一的钥匙以及机票ID,但我觉得我的设计可能缺少一些东西。

额外的好处是看看如何在Django中完成这项工作

3 个答案:

答案 0 :(得分:3)

在Django中,您可以在模型中使用“unique_together”。

http://docs.djangoproject.com/en/dev/ref/models/options/#unique-together

unique_together =((“所有者”,“接受者”),)

答案 1 :(得分:2)

这可以通过mysql中的约束或触发器来完成。

http://forge.mysql.com/wiki/Triggers#Emulating_Check_Constraints

您需要确保条件owner_id<>始终强制执行taker_id。

这可能在应用程序方面做得更好,因为您可能希望在启动分配故障单的任务(警报,状态等等)之前立即发送相应的消息...

在mysql中

,可以这样做:

DELIMITER $$
create trigger self_assign_check before insert on helpdesk.ticket for each row
begin
  if new.taker_id = new.owner_id then
     call fail(’Owner cannot take his own ticket’);
  end if;
end $$
DELIMITER ;

请注意,它会对插入产生影响(在许多情况下可忽略不计)。 fail是wiki中描述的一个帮助程序,它引发了一个重复的键错误。

答案 2 :(得分:0)

因为mysql不支持CHECK约束我建议你在数据库级别上使用触发器