【问题标题】:Is it possible to create 2 fields that may NOT have the same value?是否可以创建 2 个可能不具有相同值的字段?
【发布时间】:2010-01-24 20:28:04
【问题描述】:

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

将这两个字段设置为唯一的 :UNIQUE(owner_id, taker_id); 将不起作用,因为所有者可以同时拥有许多未使用的票。也许是三重唯一键和票证 ID,但我觉得我的设计可能缺少一些东西。

一个额外的好处是看看这将如何在 Django 中完成

【问题讨论】:

    标签: mysql django django-models


    【解决方案1】:

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

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

    unique_together = (("owner", "taker"),)

    【讨论】:

    • 一个很好的 Django 解决方案。 :)
    【解决方案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 中描述的一个帮助程序,它会引发重复键错误..

    【讨论】:

      【解决方案3】:

      由于 mysql 不支持 CHECK 约束,我建议您在数据库级别使用触发器

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-18
        • 1970-01-01
        • 1970-01-01
        • 2011-11-10
        相关资源
        最近更新 更多